c++ - 如何有效地将内核 malloc 数据返回给 cpu

标签 c++ cuda gpgpu

假设我在内核中malloc 一些结构,我在其中执行了一些计算。然后我想返回这些变量,但是当我初始化内核时它们没有作为指针发送,所以如果我想返回这些值。我将如何去做呢?下面的示例代码。

我只是作为一般性问题提出这个问题,而不是解决下面的代码。我遇到了其他问题,但我不知道最好的解决方法是什么。我知道您可以只放入一个指针并将结果复制到它上面。然而,如果结果的大小不是预先确定的,那么就很难有效地做到这一点。所以我想问一下有没有更好的方法。

__global__ void addKernel()
{
    int* c = (int*)malloc(sizeof(int) * 32);
#pragma unroll
    for (int i = 0; i < 32; i++){
        c[i] += 1;
    }
}

最佳答案

主机端 API 调用不能使用使用设备端分配(newmalloccudaMalloc)分配的指针。因此,传输存储在设备运行时分配的内存中的数据的唯一方法是在内核中将其复制到主机分配的内存并传递给正在运行的内核。

设备运行时支持memcpycudaMemcpyAsync 用于设备到设备的内存复制。我怀疑在这种情况下,这些将是您的最佳选择。你应该学习this section仔细阅读文档,以便您了解设备运行时 API 的限制。

关于c++ - 如何有效地将内核 malloc 数据返回给 cpu,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37408859/

相关文章:

c++ - 无法制作 Cuda 程序

c++ - 对 CUDA 代码使用 C++ header 结构

opencl - OpenCL 内核的随机 NaN 和错误结果

c++ - C++中未初始化的内存分配

c++ - 无法理解 CUDA 内核启动的行为

c++ - 内核同步

cuda - 我可以在编译时通过 #define 获得 CUDA 计算能力(版本)吗?

c++ - GCC 导致 lambda 捕获的参数包的段错误

c++ - 如何在没有 std::function 和 auto 的情况下定义 lambda 表达式?

c++ - 如何为具有相同模板的模板类定义和使用友元函数?