2013-06-09 2 views
2

В следующем коде нет информации, которая может привести к ее запуску на процессоре или графическом процессоре. Интересно, где выполняется операция «уменьшить»?Thrust: как напрямую контролировать, где выполняется вызов алгоритма?

#include <thrust/iterator/counting_iterator.h> 
... 
// create iterators 
thrust::counting_iterator<int> first(10); 
thrust::counting_iterator<int> last = first + 3; 

first[0] // returns 10 
first[1] // returns 11 
first[100] // returns 110 

// sum of [first, last) 
thrust::reduce(first, last); // returns 33 (i.e. 10 + 11 + 12) 

Кроме того,

thrust::transform_reduce(
    thrust::counting_iterator<unsigned int>(0), 
    thrust::counting_iterator<unsigned int>(N), 
    MyOperation(data), 0 ,thrust::plus<unsigned int>()) 

Даже если данные определяются как нажимной :: host_vector, эта функция пытается выполняться на GPU (компилятор дает ошибку, связанную, так как имя файл заканчивается .cpp). Как я могу заставить код работать в CPU. Или я должен искать другой способ выполнить ту же операцию, например. не используя counting_iterator?

+0

Я попытался с тегами counting_iterator, как описано на этой странице http://code.google.com/p/thrust/wiki/DirectSystemAccess но компилятор не может найти файл retag.h, ни OMP/память.h файл .. – phoad

ответ

4

По умолчанию вызовы алгоритмов, подобные этому, выполняются на бэкэнде устройства (т. Е. В вашем случае GPU).

Если вы используете Thrust 1.7 или лучше, использовать политику thrust::host выполнения, чтобы заставить алгоритм вызова для выполнения на хосте (то есть CPU):

#include <thrust/execution_policy.h> 

... 

thrust::reduce(thrust::host, first, last); 

... 

thrust::transform_reduce(thrust::host, 
         first, 
         last, 
         MyOperation(data), 
         0, 
         thrust::plus<unsigned int>()); 

Если вы используете Thrust 1.6 , вы можете перенастроить на вызовы к хосту с помощью retag Перенять существующий итератор:

#include <thrust/iterator/retag.h> 

... 

thrust::reduce(thrust::retag<thrust::host_system_tag>(first), 
       thrust::retag<thrust::host_system_tag>(last)); 

... 

thrust::transform_reduce(thrust::retag<thrust::host_system_tag>(first), 
         thrust::retag<thrust::host_system_tag>(last), 
         MyOperation(data), 
         0, 
         thrust::plus<unsigned int>()); 

Если вы используете старую версию упорного до 1,6, вам необходимо пройти host_space_tag к counting_iterator в качестве шаблона Параметр:

thrust::reduce(thrust::counting_iterator<unsigned int, thrust::host_space_tag>(0), 
       thrust::counting_iterator<unsigned int, thrust::host_space_tag>(N)); 
+0

Fantastic. Есть ли какой-нибудь справочный документ об этом? Я использую psg-серверы NVIDIA, и он не может найти exec_policy.h при компиляции :(Так что это не решило мою проблему, но, похоже, это решение. Я компилирую с тегом cuda_13, потому что я получаю некоторые ошибки при компиляции с cuda_20. – phoad

+1

Thrust 1.7 поставляется с CUDA 5.5, который может быть недоступен публично. Вы можете получить его от Github тем временем. Ниже приведена документация: https://github.com/thrust/thrust/wiki/Direct-System -Access –

+0

На серверах NVIDIA доступен Thrust 1.5. Поэтому я думаю, что для этой версии нет решения? Он уже поставляется с Thrust 1.5, поэтому я должен попытаться получить локальную копию Thrust и заставить ее использовать? – phoad