Я пытаюсь запрограммировать что-то простое, чтобы узнать NVidia CUDA/Thrust. Я полный ноб. То, что я пытаюсь сделать, это использовать find_if с пользовательским предикатом. Мой предикат на данный момент просто возвращает true во всем, поэтому я пытаюсь получить все входные данные. Я хочу выполнить поиск в конце концов для строк, где я инициализирую функтор некоторой строкой X, а затем разрешаю GPU находить все строки, которые соответствуют.Программирование NVidia Thrust с векторами и итераторами - Основные вопросы
Я смущен в нескольких пунктах здесь.
Я пытаюсь заполнить device_vector, полный указателей на мои строки, а затем запустить его против моего предиката MemCmp.
Во-первых, позволяет устройство_vector «знать», чтобы скопировать мою строку из основной памяти в память GPU или просто скопировать значение указателя?
Во-вторых, на линии «count = d_inputVector.end() - iter;» он возвращает 12, являющееся числом элементов в моем итераторе, которое является результатом find_if. Разве это не так? Если я попробую iter - d_inputVector.begin() возвращает ноль, который не получает нигде.
И, наконец, является ли мой метод получения результатов моей маленькой программы правильной? Могу ли я копировать память, используя команду thrust :: copy в host_vector, и достаточно ли для этого увидеть цикл, подобный одному в конце?
Любые предложения приветствуются. Спасибо,
MJ
struct MemCmp
{
__host__ __device__
bool operator()(char *data)
{
bool rv = false;
rv = true;
return rv;
}
};
....
// I initialize a device_vector and then copy pointers from main memory into the device_vector.
thrust::device_vector<char*> d_inputVector(itemCount);
for(int i=0; i<itemCount; i++){
d_inputVector[i] = inputData[i];
}
thrust::device_vector<char*>::iterator iter;
iter = thrust::find_if(d_inputVector.begin(), d_inputVector.end(), MemCmp());
// this is the count that I think is wrong.
count = d_inputVector.end() - iter;
thrust::host_vector<char*> results(count);
thrust::copy(d_inputVector.begin(), iter, results.begin());
for(thrust::host_vector<char *>::iterator it = results.begin(); it != results.end(); it++){
char* foo = *it;
}
Благодарим за ответ Роджер. Дополнительный вопрос, каков правильный способ копирования по разделу памяти, как массив символов? тяга :: device_vector = char [1000] ;? Простите мой C++, это было какое-то время. –
Я добавил раздел ответа, но он все еще неадекватен тому, что вам нужно. Я предлагаю разбить эту часть на отдельный вопрос. То есть, как использовать Thrust для работы с вектором строк (например, найти все соответствующие строки). Здесь есть очень знающие люди, которые должны быть в состоянии ответить. –
Еще раз спасибо. MJ –