cuda和cublas分段故障

cuda和cublas分段故障,cuda,cublas,Cuda,Cublas,在my main.cpp中,我在主机上创建一些向量,然后在设备上复制它们。我还创建了cublas控制柄,因为我想使用cublas: #define N 3 int main() { float a[N], b[N], c[N]; float *dev_a, *dev_b, *dev_c; // allocate the memory on the GPU cudaMalloc( &dev_a, N * sizeof(float) ) ; cudaMalloc( &am

在my main.cpp中,我在主机上创建一些向量,然后在设备上复制它们。我还创建了cublas控制柄,因为我想使用cublas:

#define N 3
int main() {
  float a[N], b[N], c[N];
  float *dev_a, *dev_b, *dev_c;
  // allocate the memory on the GPU
  cudaMalloc( &dev_a, N * sizeof(float) ) ;
  cudaMalloc( &dev_b, N * sizeof(float) );
  cudaMalloc( &dev_c, N * sizeof(float) );
  // fill the arrays 'a' and 'b' on the CPU
  for (int i=0; i<N; i++) {
    a[i] = i+0.1;
    b[i] = i*i+0.5;
    printf( "%f + %f \n", a[i], b[i]);
  }
  cudaMemcpy( dev_a, a, N * sizeof(float), cudaMemcpyHostToDevice );
  cudaMemcpy( dev_b, b, N * sizeof(float), cudaMemcpyHostToDevice );
  cublasHandle_t handle;
  cublasCreate(&handle);

 gpu_blas_sum(handle, dev_a, dev_b, dev_c, N) ;
 // copy the array 'c' back from the GPU to the CPU
 cudaMemcpy( c, dev_c, N * sizeof(float),cudaMemcpyDeviceToHost );

 // ... Free cublas memory 
}
cuda.cu

void gpu_blas_sum(cublasHandle_t &handle, float *A, float *B, float *C, int n) {
  const float alf = 1;
  A[0] = 3;
  cublasScopy(handle,n,A,1,C,1);//C = A
  cublasSaxpy(handle,n,&alf,B,1,C,1);
}
cublas.cu中的行
A[0]=3
导致分段错误。我猜我的函数gpu_blas_sum被认为是一个宿主函数

当我使用cublas函数时,如何使它在设备上执行,以便取消对设备指针的引用,并利用GPU的速度

感谢您的帮助

这是非法的:

A[0] = 3;
这是主机代码,但
A
是设备指针。cuda的基本规则是,不允许主机代码取消对设备指针的引用,也不允许设备代码取消对主机指针的引用。如果在主机代码中取消引用设备指针,可能会出现seg错误(就像取消引用主机代码中没有意义的任何其他指针,例如空指针一样)

如果您真的想做这个特定的操作,正如您所写的,那么一个乏味但可行的解决方案是:

float my_val = 3;
cudaMemcpy(A, &my_val, sizeof(float), cudaMemcpyHostToDevice);

如果您想将所有内容移动到设备上,我建议您研究一个cuda示例代码,该代码从设备调用cublas函数,例如

如果您想在GPU上运行代码,您必须编写内核(如果您使用类似推力的东西,则必须编写设备函子)。内核可以(在支持的GPU上)使用CUBLAS设备API。如果您试图询问如何编写内核,我认为您来错了地方。谢谢Talonmes。我知道如何写内核。因此,如果我理解你,我必须将GPUBLASSUM和转化成内核,创建一个C++函数,作为一个包,用一个块和一个线程启动内核,让CuBLAS通过在HODDS下启动许多线程和块来自动优化,这看起来像是巨大的努力浪费(和延迟惩罚)。与直接从主机调用CUBLAS API相比。我还是不明白这里有什么问题。您尝试访问主机上的设备指针,但失败。当然,解决的办法就是一开始就不要尝试访问主机上的设备指针?我发现问题的简化版本让我的问题变得奇怪。我的问题是我有10个矩阵A1。。。A10和一个输入向量X和10函数h1。。h10。我想计算A1*X,然后将h1应用于结果向量。所以X2=h1(A1*X),然后继续X3=h2(A2*X2)等等。。。我的矩阵在设备上一次性创建,我的函数h1。。h10被编码为内核。所以我想直接在设备上执行A1*X,结果就在设备上,我直接在设备上应用内核h1,并将其传递到下一步。请用您实际要做的事情和一些说明它的代码更新您的问题,最好是一些可以编译的东西,供其他人使用。谢谢,罗伯特。不幸的是,我当前的架构不支持DevLibCublas。您能否确认,当从主机调用时,正常的cublas确实在设备上执行?因此,使用DevLibCublas实现的速度增益将是呼叫的开销。你能估计一下时间吗?是的,当从主机调用时,正常的cublas确实是在设备上执行的。
float my_val = 3;
cudaMemcpy(A, &my_val, sizeof(float), cudaMemcpyHostToDevice);