Использование переменной устройства по нескольким потокам на CUDA

StackOverflow https://stackoverflow.com/questions/2452155

  •  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

Веселиться!

Другие советы

Вы говорите о классическом уплотнении потока. Вообще я рекомендую посмотреть Толкать или же Кудпп (Эти ссылки идут на документацию по уплотнению). Оба из них являются открытым исходным кодом, если вы хотите свернуть свой собственный, я бы также предложил взглянуть на образец Scan 'SDK.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top