2015-06-25 6 views
-1

Я до сих пор довольно новичок в Cuda, и в то время как пользователь stackoverflow дал мне описательный пример того, как использовать thrust :: copy_if для сжатия массива известного размера на хосте (поскольку я неправильно сформулировал свой вопрос), мне не удалось преобразовать подход к использованию device_vectors (для обработки введенных массивов неизвестного размера на устройстве).Cuda :: thrust: Выполнение компактной работы с Device_vector

Я пытаюсь создать уплотненный список позиций всех элементов вектора, который соответствует указанному пользователем предикату. Рабочий пример, который я получил это:

#include <thrust/copy.h> 
#include <thrust/iterator/counting_iterator.h> 
#include <thrust/functional.h> 
#include <iostream> 

using namespace thrust::placeholders; 

int main() 
{ 
    const int N = 10; 
    int objectArray[N] = { 1, 11, 7, 2, 7, 23, 6, 6, 9, 11 }; 
    int results[N]={0}; 

    int* end = thrust::copy_if(thrust::make_counting_iterator(0), thrust::make_counting_iterator(N), objectArray, results, _1 == 7); 

    thrust::copy(results, results+N, std::ostream_iterator<int>(std::cout, " ")); 
    std::cout << std::endl << "result count = " << end-results << std::endl; 
    return 0; 
} 

Я попытался изменить код, чтобы использовать векторы устройств (и вычисления на устройстве) следующим образом:

#include <thrust/copy.h> 
#include <thrust/iterator/counting_iterator.h> 
#include <thrust/functional.h> 
#include <iostream> 

using namespace thrust::placeholders; 

int soughtElement=7; 

reader.open("Numeric_1a40Coords.txt"); 
reader >> sizeOfProteinChain; //This returns the size of the input 
reader.close(); 

thrust::host_vector<int> Host_names(sizeOfProteinChain); 
thrust::host_vector<int> Host_results; 
ImportNumericNameValues("Numeric_1a40Coords.txt", Host_names); //This populates the vector with "sizeOfProteinChain" number of elements 

thrust::device_vector<int> Device_names = Host_Names; 
thrust::device_vector<int> Device_results = Host_results; 

Host_results = thrust::copy_if(thrust::make_counting_iterator(0), thrust::make_counting_iterator(sizeOfProteinChain), Device_names, Device_results, _1 == soughtElement); 

host_results=device_results; 

for (int i=0;i<sizeOfProteinChain;i++) 
cout<< host_results[i]<<" "; 
cout<<endl; 

/*Not sure how to get the resulting number of compacted position elements with device vectors instead of pointer arrays*/ 

я получаю ошибки о том, что:

класс "тяги :: device_vector>" не имеет ни одного члена "iterator_category"

и:

не экземпляр перегруженной функции «упорный :: copy_if» не совпадает со списком аргумента

Я застрял на этом некоторое время, и какие-либо предложения о том, как исправить те ошибки или более точное преобразование вышеуказанного образца. Мой предыдущий вопрос по этому вопросу can be found here:

+3

Вам дали хороший код, который может быть скопирован, составленное и запустить. В вашем коде вы решили вырезать 'int main()' и кто знает, что еще. Как это полезно для других? Почему бы не предоставить короткий, полный код? –

+0

Будете делать это в будущем. – user3486584

ответ

3

Возможно, вы захотите прочитать thrust quick start guide.

Это поможет вам в беде:

thrust::host_vector<int> Host_results; 

, что создает вектор нулевого размера. Позже, когда вы это сделаете:

thrust::device_vector<int> Device_results = Host_results; 

Вы создали другой вектор нулевого размера. Хотя они не будут создавать ошибки компиляции, если вы попытаетесь использовать их (например, скопировав что-то в них) без надлежащего распределения по размеру, у вас будут проблемы во время выполнения.

Это тоже неправильно:

Host_results = thrust::copy_if(thrust::make_counting_iterator(0), thrust::make_counting_iterator(sizeOfProteinChain), Device_names, Device_results, _1 == soughtElement); 

return value функции thrust::copy_if является итератора. Вы не можете назначить его вектору. Вектор не совпадает с итератором. Host_results - вектор.

Не уверен, что это:

host_results=device_results; 

ли вы на самом деле есть переменная или вектор где-то и начинается со строчной h?Поскольку host_results не то же самое, как Host_results

Вот полный работал пример, демонстрирующий, как сделать упорную :: copy_if на векторах устройства произвольной длины:

$ cat t808.cu 
#include <thrust/copy.h> 
#include <thrust/device_vector.h> 
#include <thrust/iterator/counting_iterator.h> 
#include <iostream> 

#define COPY_VAL 7 

using namespace thrust::placeholders; 

int main(){ 

    int objectArray[] = { 1, 11, 7, 2, 7, 23, 6, 6, 9, 11 }; 
    int dsize = sizeof(objectArray)/sizeof(int); 
    int results[dsize]; 

    thrust::device_vector<int> d_obj(objectArray, objectArray+dsize); 
    thrust::device_vector<int> d_res(dsize); 

    int resultCount = thrust::copy_if(thrust::make_counting_iterator(0), thrust::make_counting_iterator(dsize), d_obj.begin(), d_res.begin(), (_1 == COPY_VAL)) - d_res.begin(); 
    thrust::copy(d_res.begin(), d_res.end(), results); 
    std::cout << "resultCount = " << resultCount << std::endl << "results: " << std::endl; 
    thrust::copy(d_res.begin(), d_res.end(), std::ostream_iterator<int>(std::cout, ", ")); 
    std::cout << std::endl; 
    return 0; 
} 



$ nvcc -o t808 t808.cu 
$ ./t808 
resultCount = 2 
results: 
2, 4, 0, 0, 0, 0, 0, 0, 0, 0, 
$ 
+0

Спасибо, ваш код и это руководство были очень полезны - и у меня есть мои вещи, работающие :). Имена переменных в моей фактической программе заполнены конкретными словами контента, поэтому такие вещи, как Host_results и результаты хоста, были просто ужасным редактированием с моей стороны. Ошибка установки Host_results была ошибкой. Я хотел бы спросить что-нибудь, если вы все еще вокруг, поскольку Host_results - Host_vector, а Device_results - это вектор устройства, я хочу выполнить несколько операций над моим вектором на хосте, не могу использовать host_results = device_results; вернуть мои результаты на хост для обработки? – user3486584

+2

Вы читали руководство по быстрому началу толчка, которое я предложил? Потому что я думаю, что на ваш вопрос ответили. «Как показано в этом примере, оператор« = »может использоваться для копирования host_vector на device_vector (или наоборот). Оператор = можно также использовать для копирования host_vector на host_vector или device_vector на device_vector.« Как правило, существует несколько способов скинов кошка при программировании. Просто потому, что я показал или выбрал один метод, это не значит, что другие невозможны. Проблема, которую я указывала при использовании '=', была связана с векторами нулевой длины. –

+0

Я видел это в кратком руководстве. Я просто надеялся подтвердить, что окончательные детали с вами - как и предыдущие концептуальные барьеры, которые я сделал, привели к этому довольно смущающему второму вопросу. – user3486584

Смежные вопросы