我正在尝试使用带有推力的std :: bind2nd。我有使用主机指针编译的代码,但不包含设备指针。我认为它们是相同的,应该适用于这两种情况。
// this compiles fine
thrust::host_vector<unsigned int> h_vec(nwords);
thrust::host_vector<unsigned int> h_map(nwords);
thrust::host_vector<unsigned int> h_out1(nwords);
thrust::copy_if(h_vec.begin(), h_vec.end(), h_map.begin(), h_out1.begin(),
std::bind2nd(thrust::equal_to<int>(),1));
// this compilation fails with the error below
thrust::device_vector<unsigned int> d_map(nwords);
thrust::device_vector<unsigned int> d_vec(nwords);
thrust::device_vector<unsigned int> d_out1(nwords);
thrust::copy_if(d_vec.begin(), d_vec.end(), d_map.begin(), d_out1.begin(),
std::bind2nd(thrust::equal_to<int>(),1));
当我尝试使用bind2nd调用第二个copy_if时,我得到以下错误:
/opt/cuda/include/thrust/detail/internal_functional.h(99): warning: calling a
__host__ function from a __host__ __device__ function is not allowed
是否有另一种方法可以在推力中使用适配器来实现二进制功能?我见过一些人在网络上的例子中使用“thrust :: bind2nd”,但我在任何一个头文件中都找不到。
答案 0 :(得分:3)
可以在推力中使用适配器。但是如果你想在GPU上使用它们,那么适配器必须是__device__函数。这就是第一个copy_if
编译而第二个不编译的原因 - 你的谓词是主函数,而不是设备函数,device_vector
的使用意味着设备编译轨迹。
简而言之,如果您想在GPU上使用适配器功能,则需要自己编写一个,标准库(bind1st
,bind2nd
,bind
)可以不会被使用。