c - 您是否需要分配内存才能在 CUDA 中对数组进行操作?

标签 c parallel-processing cuda

关闭。这个问题需要details or clarity .它目前不接受答案。












想改进这个问题?通过 editing this post 添加详细信息并澄清问题.

2年前关闭。




Improve this question




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

这两种方法有什么不同?

谢谢!

最佳答案

无论如何,您都必须在设备上分配内存。您可以自己直接管理内存,使用类似 cudaMalloc ,或允许使用 cudaMallocManaged 为您管理它.

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

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

我不知道只将指针传递给内核并操作支持数据。

希望这可以帮助!

关于c - 您是否需要分配内存才能在 CUDA 中对数组进行操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55484800/

相关文章:

c++ - parallel_invoke 待定中的相同方法

scala - 使用 Akka 进行 fork 和 join

c - CUDA 内核操作中 Atomic 添加的一些问题

c - 在 openssl/sha.h 中声明但在共享库中找不到的函数

使用牛顿拉夫森求立方根

multithreading - Streamwriter、StringBuilder 和并行循环

cuda - 人为地降低 CUDA 计算能力以模拟其他硬件

c - C 中静态变量的问题

c - 在 c 中使用 malloc 时的自由变量

visual-studio-2010 - VS2010编译器和cuda错误:链接规范与以前的“hypot”不兼容