我有一个需要以多种方式转换的设备向量(例如,从中创建 20 个新数组),然后减少所有(总和/累加),将这些总和返回到主向量中。该代码正在使用thrust::transform_reduce,但查看nvvp会产生很多cudaMalloc/cudaFree/cudaMemcpy,从而减慢算法速度。这将在一个循环中运行,所以我的想法是预先分配一些缓存内存并 cudaMemcpy 每次迭代最后一次所有结果。我需要让它工作的是在预分配的内存中就地工作的减少。
cub::DeviceReduce::Sum 几乎做到了,但它似乎在主机内存上有输入,将其复制到设备临时存储并最终将结果复制回主机,我想避免所有这些副本。我的下一个选择是 cub inclusive_scan,但我不需要所有这些部分总和,只需要最后一个,但即使这样它可能会更快,因为不会执行任何 malloc/memcpy。
有什么方法可以通过这些库(CUB/Thrust)就地减少以节省 malloc 和 memcpy 时间?或者方法是为它编写一些自定义内核?