在CUDA中操作阵列是否需要分配内存?
我见过CUDA程序,您在设备上分配内存,对其进行操作,然后将其复制回主机,如下所示:在CUDA中操作阵列是否需要分配内存?,c,parallel-processing,cuda,C,Parallel Processing,Cuda,我见过CUDA程序,您在设备上分配内存,对其进行操作,然后将其复制回主机,如下所示: float* h_a = (float*) malloc(numBytes); float* d_a = 0; cudaMalloc((void**) &a, numBytes); cuda_function<<< N/blockSize, blockSize>>>(d_a); cudaMemcpy(d_a, h_a, numBytes, cudaMemcpyDevi
float* h_a = (float*) malloc(numBytes);
float* d_a = 0;
cudaMalloc((void**) &a, numBytes);
cuda_function<<< N/blockSize, blockSize>>>(d_a);
cudaMemcpy(d_a, h_a, numBytes, cudaMemcpyDeviceToHost);
__global__ void cuda_function(int* a)
{
...<operate on a>...
}
int main()
{
cuda_function<<<N/256, 256>>>(a)
}
float*h_a=(float*)malloc(numBytes);
浮点数*d_a=0;
Cudamaloc((void**)和a,numBytes);
cuda_功能>(d_a);
cudaMemcpy(d_a,h_a,numBytes,cudaMemcpyDeviceToHost);
但我也看到了CUDA程序只在引用被传递给它的内存上运行的代码,如下所示:
float* h_a = (float*) malloc(numBytes);
float* d_a = 0;
cudaMalloc((void**) &a, numBytes);
cuda_function<<< N/blockSize, blockSize>>>(d_a);
cudaMemcpy(d_a, h_a, numBytes, cudaMemcpyDeviceToHost);
__global__ void cuda_function(int* a)
{
...<operate on a>...
}
int main()
{
cuda_function<<<N/256, 256>>>(a)
}
\uuuuuu全局\uuuuuuu无效cuda\u函数(int*a)
{
......
}
int main()
{
cuda_函数(a)
}
这两种方法有什么不同
谢谢 无论发生什么情况,都必须在设备上分配内存。您可以使用类似于
cudamaloc
的工具直接管理内存,也可以使用cudamalocmanaged
为您管理内存
在第一种方法中,您必须使用cudaMemcpy
将内存复制到设备或从设备复制内存。然后将指向设备内存的指针(由cudamaloc
提供)作为参数传递给内核
第二种方法使用统一内存,您不必手动将数据移动到GPU或从GPU移动数据。当它被访问时,它将被分页到GPU或从GPU(并发访问有一些细微差别,但这是另一个时间的讨论)。您仍然需要向内核传递一个指针,指向使用cudamalocmanaged
分配的托管内存块
我所知道的是,不可能只传递一个指向内核的指针并对备份数据进行操作
希望这有帮助你可能想考虑一个基本的C教程。有设备和主机内存这一事实是CUDA的一个特殊功能,但您要问的是C、内存管理和指针的基础知识。区别在于一个可以工作,另一个不能工作。我将把它作为一个练习留给读者猜测哪个是哪个……我也倾向于认为OP可能是在谈论统一内存。然而,请注意,实际上不可能这么说。严格地说,上面问题中给出的第二个示例没有显示任何可以使其与之区分的内容,例如,如果您只使用第一个示例并删除除内核启动之外的每一行,您将得到什么。所有相关的部分都不见了……是的,当然。最下面的一个只能用“照我说的做,不要照我说的做”的语言。CUDA绝对不是。