используя std::bind2nd с тягой

Я пытаюсь использовать 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));

Когда я пытаюсь вызвать вторую копию copy_if с помощью bind2nd, я получаю следующую ошибку:

 /opt/cuda/include/thrust/detail/internal_functional.h(99): warning: calling a
 __host__ function from a __host__ __device__ function is not allowed

Есть ли другой способ использования адаптеров для бинарных функций в тяге? Я видел, как некоторые люди использовали «thrust::bind2nd» в примерах в Интернете, но я не могу найти это ни в одном из наших заголовочных файлов.


person Sol Arnu    schedule 01.03.2013    source источник
comment
Используйте выражение-заполнитель thrust::placeholders::_1 == 1 для этой операции вместо того, чтобы пытаться использовать что-то вроде bind2nd.   -  person Jared Hoberock    schedule 01.03.2013
comment
это тоже хорошая идея. Спасибо.   -  person Sol Arnu    schedule 02.03.2013


Ответы (1)


Можно использовать переходники в тяге. Но если вы хотите использовать их на графическом процессоре, адаптер должен быть функцией __device__. Вот почему первый copy_if компилируется, а второй нет — ваш предикат является функцией хоста, а не функцией устройства, а использование device_vector подразумевает траекторию компиляции устройства.

Короче говоря, если вам нужна функция адаптера для использования на графическом процессоре, вам нужно будет написать ее самостоятельно, стандартные библиотечные (bind1st, bind2nd, bind) использовать нельзя.

person talonmies    schedule 01.03.2013
comment
Спасибо. Поскольку я предполагаю, что стандартный stl не имеет идентификаторов host или device, он просто по умолчанию использует host? - person Sol Arnu; 01.03.2013
comment
@SolArnu: Да. Неукрашенный код (поэтому без __device__ или __host__) по умолчанию использует траекторию компиляции хоста. - person talonmies; 02.03.2013