2013-03-01 3 views
1

Я пытаюсь использовать std :: bind2nd с тягой. У меня есть код, который компилируется с указателем узла, но не с указателем устройства. Я думаю, что они идентичны и должны работать в обоих случаях.using std :: bind2nd with thrust

// 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» в примерах в Интернете, но я не могу найти это в любом из наших файлов заголовков.

+1

Используйте выражение-заполнитель 'thrust :: placeholders :: _ 1 == 1' для этой операции вместо того, чтобы пытаться использовать что-то вроде' bind2nd'. –

+0

это также хорошая идея. Спасибо. –

ответ

3

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

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

+0

Спасибо. Поскольку я предполагаю, что стандартная stl не имеет идентификаторов __host__ или __device__, то она по умолчанию равна __host__? –

+1

@SolArnu: Да. Undecorated code (поэтому no \ _ \ _ device \ _ \ _ или \ _ \ _ хост \ _ \ _) по умолчанию соответствует траектории компиляции хоста. – talonmies