从多个cuda文件访问同一设备内存

从多个cuda文件访问同一设备内存,cuda,Cuda,我想设计一个代码,在这个代码中,相同的设备内存应该从多个cuda文件的内核中访问。下面给出了一个简化示例,其中main.c调用3.cu文件:cuda_malloc.cu、cuda_print.cu和cuda_free.cu Main.c文件:声明一个指针“d_数组” cuda_malloc.cu文件:为d_数组分配设备内存并将值设置为零 extern "C" void cuda_malloc(int maxpar, float* d_array) { CUDA_SAFE_CALL(cud

我想设计一个代码,在这个代码中,相同的设备内存应该从多个cuda文件的内核中访问。下面给出了一个简化示例,其中main.c调用3.cu文件:cuda_malloc.cu、cuda_print.cu和cuda_free.cu

Main.c文件:声明一个指针“d_数组”

cuda_malloc.cu文件:为d_数组分配设备内存并将值设置为零

extern "C" void cuda_malloc(int maxpar, float* d_array)
{
    CUDA_SAFE_CALL(cudaMalloc((void**)&d_array,sizeof(float)*maxpar));
    CUDA_SAFE_CALL(cudaMemset(d_array,'\0',sizeof(float)*maxpar));
}
cuda_print.cu文件:调用“内核”从设备内存打印“d_数组”

extern "C"
{
__global__ void kernel(int maxpar, float* d_array)
{
    int tid = threadIdx.x;
    if (tid >= maxpar) return;
    printf("tId = %d, d_array[i] = %f \n",tid,d_array[tid]);
}

    void cuda_print(int maxpar, float* d_array)
{
    //If I un-comment the following 2 lines, the kernel function prints array values
    //otherwise, it does not
    //CUDA_SAFE_CALL(cudaMalloc((void**)&d_array,sizeof(float)*maxpar));
    //CUDA_SAFE_CALL(cudaMemset(d_array,'\0',sizeof(float)*maxpar));

    kernel <<<1, maxpar>>> (maxpar,d_array);

    cudaDeviceSynchronize();
    cudaGetLastError();
}
这段代码编译得很好。注意,我试图在“cuda_print.cu”文件中调用的“kernel”函数中打印“d_array”。但是,它不会打印它。也没有错误。若在“cuda print.cu”文件中,我再次分配设备内存并将其设置为零,然后内核打印它

我的问题是:如何从多个cuda文件访问同一设备内存


谢谢

您的问题出在函数
void cuda_malloc(int-maxpar,float*d_数组)
中。当你打电话时:

CUDA_SAFE_CALL(cudaMalloc((void**)&d_array,sizeof(float)*maxpar));
CUDA_SAFE_CALL(cudaMemset(d_array,'\0',sizeof(float)*maxpar));
d_数组
仅“本地”更改

与您的方法不同,您的函数应该如下所示:

extern "C" void cuda_malloc(int maxpar, float** d_array) {
    CUDA_SAFE_CALL(cudaMalloc((void**)d_array,sizeof(float)*maxpar));
    CUDA_SAFE_CALL(cudaMemset(*d_array,'\0',sizeof(float)*maxpar));    
}
cuda_malloc(maxpar, &d_array);
这样称呼它:

extern "C" void cuda_malloc(int maxpar, float** d_array) {
    CUDA_SAFE_CALL(cudaMalloc((void**)d_array,sizeof(float)*maxpar));
    CUDA_SAFE_CALL(cudaMemset(*d_array,'\0',sizeof(float)*maxpar));    
}
cuda_malloc(maxpar, &d_array);

您的问题在于函数
void cuda_malloc(int-maxpar,float*d_数组)
。当你打电话时:

CUDA_SAFE_CALL(cudaMalloc((void**)&d_array,sizeof(float)*maxpar));
CUDA_SAFE_CALL(cudaMemset(d_array,'\0',sizeof(float)*maxpar));
d_数组
仅“本地”更改

与您的方法不同,您的函数应该如下所示:

extern "C" void cuda_malloc(int maxpar, float** d_array) {
    CUDA_SAFE_CALL(cudaMalloc((void**)d_array,sizeof(float)*maxpar));
    CUDA_SAFE_CALL(cudaMemset(*d_array,'\0',sizeof(float)*maxpar));    
}
cuda_malloc(maxpar, &d_array);
这样称呼它:

extern "C" void cuda_malloc(int maxpar, float** d_array) {
    CUDA_SAFE_CALL(cudaMalloc((void**)d_array,sizeof(float)*maxpar));
    CUDA_SAFE_CALL(cudaMemset(*d_array,'\0',sizeof(float)*maxpar));    
}
cuda_malloc(maxpar, &d_array);

您的
cuda\u malloc
功能不正确。必须通过引用而不是通过值将分配的指针传递给该函数。这实际上与CUDA无关,而是理解C语言中指针的工作原理。您的
CUDA\u malloc
函数不正确。必须通过引用而不是通过值将分配的指针传递给该函数。这实际上与CUDA无关,而是理解C语言中指针的工作原理。感谢stuhlo和@Talonmes:My bad,我是一名新的C和CUDA程序员。谢谢你指出我的错误并改正它。谢谢stuhlo和@Talonmes:我的错,我是一个新的C和CUDA程序员。谢谢你指出我的错误并改正它。