2012-05-05 2 views
0

Я пытаюсь запрограммировать что-то простое, чтобы узнать 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; 
} 

ответ

2

find_if не хорошая функция, чтобы найти все строки, которые соответствуют. Он просто находит первый первый элемент, который соответствует. Взгляните на copy_if.

Во-первых, устройство_vector «знает», чтобы скопировать мою строку из основной памяти в память GPU или просто скопировать значение указателя?

Вы получите значения указателей, которые не имеют значения на графическом процессоре.

В C++ для запуска на процессоре вы должны использовать std::string для хранения ваших строк. Таким образом, это будет std::vector<std::string>. Вопросы осложняются тем фактом, что нет реализации устройства string, поэтому вы не можете копировать их на GPU.

Кроме того, многие из алгоритмов STL (я предполагаю, что это то же самое с thrust) требуют, чтобы объекты, являющиеся элементами вектора, имели рабочий конструктор копирования и операторы присваивания. Компилятор поставляет те для базовых типов, но не для массива символов.

Итак, ваше простое упражнение по изучению CUDA/Trust может оказаться таким простым. I думаю, вам нужен класс C++, который инкапсулирует массив фиксированного размера символов и реализует функции устройства для необходимых операторов.

Кроме того, перемещение вектора с большим количеством элементов в память устройства таким образом очень неэффективно, потому что каждое присваивание, которое вы делаете для device_vector, вызывает отдельную копию от хоста к памяти устройства для выполнения в фоновом режиме. Вместо этого введите host_vector и затем назначьте host_vector на номер device_vector. Затем выполняется только одна копия от хоста к памяти устройства.

Во-вторых, на линии «count = d_inputVector.end() - iter;» он возвращает 12, являющееся числом элементов в моем итераторе, которое является результатом find_if. Разве это не так? Если я попробую iter - d_inputVector.begin() возвращает ноль, который не получает нигде.

Выражение должно быть count = d_inputVector.begin() - iter;, и оно должно возвращать 0, потому что первый элемент в векторе соответствует найденному.

И, наконец, является ли мой метод получения результатов моей маленькой программы правильной? Могу ли я копировать память, используя команду thrust :: copy в host_vector, и достаточно ли для этого увидеть цикл, подобный одному в конце?

После того как вы создали device_vector с вашими результатами, просто присвоить его host_vector, чтобы переместить его в память компьютера в одной операции.

thrust::host_vector<char*> H = D; 
+0

Благодарим за ответ Роджер. Дополнительный вопрос, каков правильный способ копирования по разделу памяти, как массив символов? тяга :: device_vector = char [1000] ;? Простите мой C++, это было какое-то время. –

+0

Я добавил раздел ответа, но он все еще неадекватен тому, что вам нужно. Я предлагаю разбить эту часть на отдельный вопрос. То есть, как использовать Thrust для работы с вектором строк (например, найти все соответствующие строки). Здесь есть очень знающие люди, которые должны быть в состоянии ответить. –

+0

Еще раз спасибо. MJ –

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

  • Нет связанных вопросов^_^