使用cudaMalloc()分配的内存是否可由主机访问?

时间:2013-10-04 15:28:34

标签: cuda nvidia

在第26页的CUDA示例书中,它写道:

  

您可以将使用cudaMalloc()分配的指针传递给那些函数   在主机上执行。

     

您不能使用cudaMalloc()分配的指针来读取或写入   来自在主机上执行的代码的内存。

为了演示我在这里编写代码的第一个概念:

main()
{
int * ad, N;

cudaMalloc((void **)&ad, Sizeof(int) *N);

GPUFunction<<<...>>>(ad);
Hostfunction(ad);

}


Hostfunction(int * AD)

{

int c ;

c=AD[N-1];

printf("%d", c);

}


  __global__ void GPUFunction(int *AD)

{

AD[threadIdx.x]= threadidx.x;
}

这是上述第1点解释的内容吗?如果是这样,它与上面的第2点相矛盾,因为您可以看到主机功能正在读取内存广告。那么我的理解在哪里出错了?

2 个答案:

答案 0 :(得分:2)

这两点并不矛盾。

第一点只是意味着您可以完全按照惯例将AD指针传递给HostFunction,但这并不意味着您可以通过

直接访问设备内存
c=AD[N-1];

正如第二点告诉你的那样。

您可以做的是使用指针执行其他cudaMemcpy操作或将该指针传递给__global__函数。

因此,可能HostFunction可能是

__global__ void GPUFunction(int *AD)
{
    AD[threadIdx.x]= threadidx.x;
}

Hostfunction(int * AD)
{
    GPUFunction<<<...,...>>>(AD);
}

答案 1 :(得分:2)

无法看到主机功能正在读取内存ad。你肯定写了一些尝试这样做的代码,但它是无效的代码,它会导致错误。

由于您在此提供的代码不完整或无法编译,因此无法展示任何内容。

以下是一个与您输入的内容非常接近的可编辑示例,它表明Hostfunction传递后ad将无法正常工作:

$ cat t251.cu
#include <stdio.h>

  __global__ void GPUFunction(int *AD)

{

AD[threadIdx.x]= threadIdx.x;
}

void Hostfunction(int * AD, int N)

{

int c ;

printf("preparing to read ad in host code\n");
c=AD[N-1];

printf("%d", c);

}

int main()
{
int * ad, N;
N = 1;
cudaMalloc((void **)&ad, sizeof(int) *N);

GPUFunction<<<1,1>>>(ad);
Hostfunction(ad, N);

}


$ nvcc -arch=sm_20 -o t251 t251.cu
$ ./t251
preparing to read ad in host code
Segmentation fault (core dumped)
$