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

主机是否可以访问使用cudamaloc()分配的内存?,cuda,nvidia,Cuda,Nvidia,在第26页的《CUDA举例》一书中,它写道: 您可以将分配给cudamaloc()的指针传递给 在主机上执行 不能使用cudamaloc()分配的指针进行读写操作 在主机上执行的代码的内存 为了演示第一个概念,我在这里编写代码: main() { int * ad, N; cudaMalloc((void **)&ad, Sizeof(int) *N); GPUFunction<<<...>>>(ad); Hostfunction(ad); }

在第26页的《CUDA举例》一书中,它写道:

您可以将分配给cudamaloc()的指针传递给 在主机上执行

不能使用cudamaloc()分配的指针进行读写操作 在主机上执行的代码的内存

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

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;
}
main()
{
int*ad,N;
Cudamaloc((无效**)和ad,尺寸(内部)*N);
GPUFunction(ad);
主机功能(ad);
}
主机功能(int*AD)
{
INTC;
c=AD[N-1];
printf(“%d”,c);
}
__全局无效GPU函数(int*AD)
{
AD[threadIdx.x]=threadIdx.x;
}

这就是上面第1点所解释的吗?如果是这样,这与上面第2点相矛盾,正如你所看到的,主机函数是读取内存广告。那么我的理解哪里出了问题

这两点并不矛盾

第一点仅仅意味着您可以完全按照自己的操作将
AD
指针传递到
HostFunction
,但这并不意味着您可以直接访问设备内存

c=AD[N-1];
正如第二点告诉你的

例如,您可以使用指针执行其他
cudaMemcpy
操作,或将该指针传递给
\uuuu全局函数

因此,一个可能的
HostFunction
可能是

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

Hostfunction(int * AD)
{
    GPUFunction<<<...,...>>>(AD);
}
\uuuu全局\uuuuu无效gpu函数(int*AD)
{
AD[threadIdx.x]=threadIdx.x;
}
主机功能(int*AD)
{
GPUFunction(AD);
}

这两点并不矛盾

第一点仅仅意味着您可以完全按照自己的操作将
AD
指针传递到
HostFunction
,但这并不意味着您可以直接访问设备内存

c=AD[N-1];
正如第二点告诉你的

例如,您可以使用指针执行其他
cudaMemcpy
操作,或将该指针传递给
\uuuu全局函数

因此,一个可能的
HostFunction
可能是

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

Hostfunction(int * AD)
{
    GPUFunction<<<...,...>>>(AD);
}
\uuuu全局\uuuuu无效gpu函数(int*AD)
{
AD[threadIdx.x]=threadIdx.x;
}
主机功能(int*AD)
{
GPUFunction(AD);
}
我看不到主机功能正在读取内存
ad
。当然,您已经编写了一些尝试这样做的代码,但它是无效代码,并且会出现seg错误

因为这里提供的代码不完整或不可编译,所以它没有演示任何内容

下面是一个与您键入的内容非常接近的可编译示例,该示例演示了当传递
ad
时,您的
Hostfunction
将无法正常工作:

$ 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)
$
$cat t251.cu
#包括
__全局无效GPU函数(int*AD)
{
AD[threadIdx.x]=threadIdx.x;
}
无效主机函数(int*AD,int-N)
{
INTC;
printf(“准备读取主机代码中的ad\n”);
c=AD[N-1];
printf(“%d”,c);
}
int main()
{
int*ad,N;
N=1;
Cudamaloc((无效**)和ad,尺寸(内部)*N);
GPUFunction(ad);
主机功能(ad,N);
}
$nvcc-arch=sm_20-o t251 t251.cu
美元/t251
正在准备读取主机代码中的广告
分段故障(堆芯转储)
$
我看不到主机功能正在读取内存
ad
。当然,您已经编写了一些尝试这样做的代码,但它是无效代码,并且会出现seg错误

因为这里提供的代码不完整或不可编译,所以它没有演示任何内容

下面是一个与您键入的内容非常接近的可编译示例,该示例演示了当传递
ad
时,您的
Hostfunction
将无法正常工作:

$ 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)
$
$cat t251.cu
#包括
__全局无效GPU函数(int*AD)
{
AD[threadIdx.x]=threadIdx.x;
}
无效主机函数(int*AD,int-N)
{
INTC;
printf(“准备读取主机代码中的ad\n”);
c=AD[N-1];
printf(“%d”,c);
}
int main()
{
int*ad,N;
N=1;
Cudamaloc((无效**)和ad,尺寸(内部)*N);
GPUFunction(ad);
主机功能(ad,N);
}
$nvcc-arch=sm_20-o t251 t251.cu
美元/t251
正在准备读取主机代码中的广告
分段故障(堆芯转储)
$