gpt4 book ai didi

c++ - 将复杂数据从主机传输到设备的简单 CUDA 代码问题

转载 作者:行者123 更新时间:2023-11-28 00:41:21 27 4
gpt4 key购买 nike

我从网上复制了以下代码,并尝试在安装了 Tesla C2075 的服务器中编译,应该支持 double ,我还使用标志 sm_20 编译代码

#include <iostream>
#include <iomanip>
#include <fstream>
#include <cuda_runtime.h>
#include <cuComplex.h>
#include <cublas_v2.h>

using namespace std;

typedef double2 Complex;

#define m 1024
#define n 300
#define k 1024

int main(int argc, char *argv[])
{
Complex _A[m*k], _B[k*n];
Complex *A, *B;

cudaMalloc((void**)&A, m*k*sizeof(Complex));
cudaMalloc((void**)&B, k*n*sizeof(Complex));

for (int i=0; i<m*k; i++) _A[i] = make_cuDoubleComplex(rand()/(double)RAND_MAX, rand()/(double)RAND_MAX);;
for (int i=0; i<k*n; i++) _B[i] = make_cuDoubleComplex(rand()/(double)RAND_MAX, rand()/(double)RAND_MAX);

cudaMemcpy( A, _A, (m*k)*sizeof(Complex), cudaMemcpyHostToDevice );
cudaMemcpy( B, _B, (k*n)*sizeof(Complex), cudaMemcpyHostToDevice );

return 0;
}

它确实可以编译,但在运行时,它总是返回“Segmentation fault (core dumped)”。代码有什么问题吗?谢谢。

最佳答案

你的数组 _A_B很可能太大而无法放入堆栈。快速解决方法是将数组移出到全局范围。更好的解决方法是使用 new 和 delete 动态分配它们,如下所示:

Complex *_A = new Complex[m*k];
Complex *_B = new Complex[k*n];
...
delete [] _A;
delete [] _B;

更好的选择是使用 std::vector:

std::vector < Complex > _A(m*k);
std::vector < Complex > _B(k*n);

// But now to get the pointer you need this:
cudaMemcpy( A, &_A[0], (m*k)*sizeof(Complex), cudaMemcpyHostToDevice );
// etc.

那个&_A[0]语法意思是:取vector第一个元素的地址,与指向整个数组的指针相同。与手动分配内存相比,更喜欢 vector 的原因是当变量超出范围时,销毁/解除分配会自动发生,这对于编写异常安全代码至关重要。

您还需要 #include <vector>

关于c++ - 将复杂数据从主机传输到设备的简单 CUDA 代码问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18721112/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com