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