你需要在CUDA中分配内存来操作数组吗? [关闭]

问题描述 投票:-2回答:1

我见过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);

但是后来我也看到了CUDA程序只对内存进行操作的代码,其引用传递给它,如下所示:

__global__ void cuda_function(int* a)
{
  ...<operate on a>...
}

int main()
{
  cuda_function<<<N/256, 256>>>(a)
}

这两种方法有什么不同?

谢谢!

c parallel-processing cuda
1个回答
1
投票

无论如何,您必须在设备上分配内存。你可以自己直接管理内存,使用像cudaMalloc这样的东西,或者允许使用cudaMallocManaged为你管理内存。

在第一种方法中,您必须使用cudaMemcpy将内存复制到设备和从设备复制内存。然后,将内核指针传递给设备内存(由cudaMalloc提供)作为参数。

第二种方法使用统一内存,您不必手动将数据移入或移出GPU。当它被访问时,它将被分页到GPU或GPU(有一些并发访问的细微差别,但这是另一次的讨论)。您仍然需要向内核传递指向使用cudaMallocManaged分配的托管内存块的指针。

我不知道只是将指针传递给内核并对后备数据进行操作。

希望这可以帮助!

© www.soinside.com 2019 - 2024. All rights reserved.