0

在 CUDA By Example 一书第 26 页上,它写道:

您可以将使用 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 点相矛盾,如您所见,主机功能正在读取记忆广告。那么我的理解哪里出了问题?

4

2 回答 2

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)
$
于 2013-10-04T15:48:50.077 回答
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);
}
于 2013-10-04T15:40:44.637 回答