c - 您是否需要分配内存才能在 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, 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
.
我不知道只将指针传递给内核并操作支持数据。
希望这可以帮助!
推荐阅读
- nunit - 团队城市。如何仅从特定类别运行测试
- javascript - 刷新后活动状态不会停留
- google-api - 外部组成员身份的状态属性
- python - 如何在使用 opencv 的视频上通过 Canny Edge 检测减少闪烁并显示较粗的线条?
- azure-devops - Azure DevOps 构建管道 - 无法部署 .NET Core 应用
- ruby-on-rails - 使用 Alchemy 的 Rails - 正确设置 Cache-Control 标头
- spring - Spring SAML 发送错误的 AuthNRequest
- mysql - 如何根据 REST API 请求中的标头连接到多个 MySQL 数据库
- python - 如何使您的具有 GUI 的代码在 Amazon EC2 实例上运行
- syntax - 如何编写查询以在 RediSearch 中包含和排除标签?