cuda - 插入用户编写的内核

标签 cuda thrust

我是 Thrust 的新手。我发现所有 Thrust 演示文稿和示例仅显示主机代码。

我想知道是否可以将 device_vector 传递给我自己的内核?如何? 如果是,那么内核/设备代码中允许对其进行哪些操作?

最佳答案

正如最初编写的那样,Thrust 纯粹是主机端抽象。它不能在内核内部使用。您可以将封装在 thrust::device_vector 内的设备内存传递给您自己的内核,如下所示:

thrust::device_vector< Foo > fooVector;
// Do something thrust-y with fooVector

Foo* fooArray = thrust::raw_pointer_cast( fooVector.data() );

// Pass raw array and its size to kernel
someKernelCall<<< x, y >>>( fooArray, fooVector.size() );

您还可以通过使用裸cuda设备内存指针实例化thrust::device_ptr,在推力算法中使用未由推力分配的设备内存。

四年半后编辑补充说,根据 @JackOLantern 的回答,thrust 1.8 添加了顺序执行策略,这意味着您可以在设备上运行 Thrust 算法的单线程版本。请注意,仍然无法将推力设备向量直接传递到内核,并且设备向量不能直接在设备代码中使用。

请注意,在某些情况下也可以使用 thrust::device 执行策略来让内核作为子网格启动并行推力执行。这需要单独的编译/设备链接和支持动态并行性的硬件。我不确定所有推力算法是否实际上都支持这一点,但肯定适用于某些算法。

关于cuda - 插入用户编写的内核,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5510715/

相关文章:

c++ - 如果我使用 BLAS/cuBLAS 以使其性能优于普通 C/CUDA,矩阵应该有多大?

gcc - 创建 CUDA 共享库和 libpthread 的问题

c++ - 用推力调用手写的CUDA内核

cuda - 指定结束位时 cub::DeviceRadixSort 失败

c++ - Simpson 的 Thrust 集成代码在两台使用 NVC++ 的机器上输出不同的结果

c++ - 为维数增加(点数)的点云分配 CUDA 设备内存

cuda - OpenCL (Cuda) 中的逐元素运算

c++ - 我可以告诉 nvcc 将 #pragma unroll 应用于函数中的所有循环吗?

cuda - 简单的 CUDA 推力程序错误

c++ - 将数据从较小的 vector 复制到较大的 vector