在我的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速度?
感谢您的帮助
答案 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