Использование переменной устройства по нескольким потокам на CUDA
-
20-09-2019 - |
Вопрос
Я играю с Cuda.
На данный момент у меня есть проблема. Я тестирую большой массив для определенных ответов, и когда я получаю ответ, я должен скопировать данные на другой массив.
Например, мой тестовый массив из 5 элементов выглядит так:
] [] [v1] [] [] [v2
Результат должен выглядеть так:
v1] [v2
Проблема в том, как я могу рассчитать адрес второго массива для хранения результата? Все элементы первого массива проверяются параллельно.
Я думаю объявить переменную устройства int Адр = 0. Каждый раз, когда я нахожу ответ, я увеличу Адр. Анкет Но я не уверен в этом, потому что это означает, что Адр можно получить доступ к нескольким потокам одновременно. Это вызовет проблемы? Или поток будет ждать, пока другой поток не закончится, используя эту переменную?
Решение
Не так тривиально, как кажется. Я только что закончил реализовать один и могу сказать, что вам нужно прочитать Сканировать GPU GEMS 3 статья в частности, глава 39.3.1 Уплотнение потока.
Чтобы реализовать свой собственный старт из примера LargeArrayScan в SDK, это даст вам только Прескан. Предполагая, что у вас есть массив выбора в памяти устройства (массив 1 и 0, что означает 1- Выберите 0 - DISHARD), dev_selection_array а dev_elements_array элементы, которые должны быть выбраны dev_prescan_array и dev_result_array Весь размер Не Тогда вы это сделаете
prescan(dev_prescan_array,dev_selection_array, N);
scatter(dev_result_array, dev_prescan_array,
dev_selection_array, dev_elements_array, N);
где разброс
__global__ void scatter_kernel( T*dev_result_array,
const T* dev_prescan_array,
const T* dev_selection_array,
const T* dev_elements_array, std::size_t size){
unsigned int idx = blockIdx.x * blockDim.x + threadIdx.x;
if (idx >= size) return;
if (dev_selection_array[idx] == 1){
dev_result_array[dev_prescan_array[idx]] = dev_elements_array[idx];
}
}
Для другого хорошего применения Прескана см. бумагу Ble93
Веселиться!
Другие советы