在第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点相矛盾,因为您可以看到主机功能正在读取内存广告。那么我的理解在哪里出错了?
答案 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)
$