Я до сих пор довольно новичок в 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:
Вам дали хороший код, который может быть скопирован, составленное и запустить. В вашем коде вы решили вырезать 'int main()' и кто знает, что еще. Как это полезно для других? Почему бы не предоставить короткий, полный код? –
Будете делать это в будущем. – user3486584