cuda和cublas分段错误

时间:2015-10-08 08:00:14

标签: cuda cublas

在我的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和cuda.h文件,以便在设备上面的代码中调用gpu_blas_sum

cuda.h

void gpu_blas_sum(cublasHandle_t &handle,  float *A,  float *B, float *C,  int n) ;

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速度?

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

这是非法的:

NSURLCache

这是主机代码,但<meta http-equiv="Content-Security-Policy" content=" default-src 'self' data: gap: https://ssl.gstatic.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://*.gstatic.com https://*.googleapis.com; style-src 'self' 'unsafe-inline' 'unsafe-eval' https://*.gstatic.com https://*.googleapis.com; font-src 'self' 'unsafe-inline' 'unsafe-eval' https://*.gstatic.com https://*.googleapis.com; img-src 'self' 'unsafe-inline' 'unsafe-eval' data: https://*.gstatic.com https://*.googleapis.com; media-src *"> 设备指针。基本的cuda规则是不允许主机代码取消引用设备指针,并且不允许设备代码取消引用主机指针。如果您在主机代码中取消引用设备指针,则可能会产生seg错误(就像您取消引用在主机代码中没有任何意义的任何其他指针一样,例如NULL指针)。

如果你真的想做这个特定的操作,就像你写的一样,那么一个繁琐但可行的解决方案就是:

A[0] = 3;

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