我是 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/