在我的项目中,我广泛使用nVidia CUDA技术,有时候也会使用Thrust库来处理某些特定的任务。其中一个在这个库里实现得非常好的算法就是“Reduce”。其中一种使用情况是通过将向量中的每个非负元素除以所有元素的总和来对向量进行规范化操作。
template <typename T>
void normalise(T const* const d_input, const unsigned int size, T* d_output)
{
const thrust::device_ptr<T> X = thrust::device_pointer_cast(const_cast<T*>(d_input));
T sum = thrust::reduce(X, X + size);
thrust::constant_iterator<T> denominator(sum);
thrust::device_ptr<T> Y = thrust::device_pointer_cast(d_output);
thrust::transform(X, X + size, denominator, Y, thrust::divides<T>());
}
(T
通常是float
或double
)
总的来说,我不想在整个代码库中完全依赖于Thrust,因此我尽量确保像上面示例中的函数仅接受原始的CUDA设备指针。这意味着一旦它们被NVCC编译,我可以将它们静态链接到其他代码中而无需NVCC。
然而,这段代码让我担心。我希望该函数是const正确的,但我似乎找不到thrust::device_pointer_cast(...)
的const
版本 - 是否存在这样的东西?在这个代码版本中,我采用了const_cast
,以便在函数签名中使用const
,这让我感到难过。
顺便说一下,将reduce的结果复制到主机,然后再将其发送回设备进行下一步操作感觉有些奇怪。有更好的方法吗?
thrust::device_ptr<const T>
? - Angew is no longer proud of SOthrust::device_ptr<const T> X = thrust::device_pointer_cast<const T>(d_input)
很好。 - Xharlie