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

C++ 将复杂数据从主机传输到设备的简单CUDA代码中的问题,c++,cuda,complextype,C++,Cuda,Complextype,我从互联网上复制了以下代码,并尝试在安装了Tesla C2075的服务器上编译,应支持双精度,我还编译了带有标志sm_20的代码 #include <iostream> #include <iomanip> #include <fstream> #include <cuda_runtime.h> #include <cuComplex.h> #include <cublas_v2.h> using namespace st

我从互联网上复制了以下代码,并尝试在安装了Tesla C2075的服务器上编译,应支持双精度,我还编译了带有标志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;
}
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
2型复合物;
#定义m1024
#定义n 300
#定义k1024
int main(int argc,char*argv[])
{
复形_A[m*k],_B[k*n];
复合物*A,*B;
Cudamaloc((void**)和A、m*k*sizeof(综合体));
cudamaloc((void**)和B,k*n*sizeof(Complex));

对于(int i=0;i您的数组
\u A
\u B
很可能太大,无法放入堆栈中。快速修复方法是将数组移出全局范围。更好的修复方法是使用new和delete动态分配它们,如下所示:

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

一个更好的选择,因为你使用C++,所以使用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.
std::vector\u A(m*k);
std::vector_B(k*n);
//但现在要获取指针,您需要:
cudaMemcpy(A,&u A[0],(m*k)*sizeof(Complex),cudaMemcpyHostToDevice);
//等等。
&u A[0]
语法意思是:取向量的第一个元素的地址,它与指向整个数组的指针相同。之所以选择向量而不是手动分配内存,是因为当变量超出范围时,会自动进行销毁/解除分配,这对于编写异常安全代码至关重要


您还需要
#include

您的数组
\u A
\u B
很可能太大,无法放入堆栈。快速修复方法是将数组移出全局范围。更好的修复方法是使用new和delete动态分配它们,如下所示:

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

一个更好的选择,因为你使用C++,所以使用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.
std::vector\u A(m*k);
std::vector_B(k*n);
//但现在要获取指针,您需要:
cudaMemcpy(A,&u A[0],(m*k)*sizeof(Complex),cudaMemcpyHostToDevice);
//等等。
&u A[0]
语法意思是:取向量的第一个元素的地址,它与指向整个数组的指针相同。之所以选择向量而不是手动分配内存,是因为当变量超出范围时,会自动进行销毁/解除分配,这对于编写异常安全代码至关重要


您还需要
#include

此解决方案的问题是
vector
在设备上不起作用。尝试使用推力或。这是不应该的。矢量仅在主机端。使用推力没有错,但这不是问题所在……是的,你是对的。我只是指出它是建议使用适合设备端的vector/matrix类,因为我假设海报除了在CPU和GPU之间来回移动数据外,还想进一步开发代码。此解决方案的问题是
vector
在设备上不起作用。尝试使用推力或。不应该这样。vector是主机端o只是。使用推力没有什么错,但这不是问题所在……是的,你是对的。我只是指出,建议使用适合设备端的向量/矩阵类,因为我假设海报除了在CPU和GPU之间来回移动数据外,还想进一步开发代码。