2010-03-16 2 views
0

Я играю с кудой.Использование переменной устройства несколькими потоками на CUDA

На данный момент у меня есть проблема. Я тестирую большой массив для конкретных ответов, и когда я получаю ответ, мне приходится копировать данные на другой массив.

Например, мой тестовый массив из 5 элементов выглядит следующим образом:
[] [] [v1] [] [] [v2]

Результат должен выглядеть следующим образом:
[v1] [v2 ]

Проблема заключается в том, как вычислить адрес второго массива для хранения результата? Все элементы первого массива проверяются параллельно.

Я имею в виду, чтобы объявить переменную устройства Int адр = 0. Каждый раз, когда я найду ответ, я буду увеличивать эл. Но я не уверен в этом, потому что это означает, что addr может быть доступен несколькими потоками одновременно. Это вызовет проблемы? Или поток будет ждать, пока другой поток не закончит использование этой переменной?

ответ

1

Не так тривиально, как кажется. Я только что закончил, чтобы реализовать один, и я могу рассказать, что вам нужно читает scan Gpu Gems 3 Article, в частности, глава 39.3.1 Уплотнение потока.

Чтобы реализовать свое собственное начало из примера LargeArrayScan в SDK, это даст вам только предварительное сканирование. Предполагая, что вы имеете массив выбора в памяти устройства (массив 1 и 0 означает 1- выберите 0 - отбрасывают), dev_selection_arraydev_elements_array элементы для выбора dev_prescan_array и dev_result_array всех размеров N тогда вы

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

Удачи!

0

Вы говорите о классическом сжатии потока. Обычно я бы рекомендовал посмотреть на Thrust или CUDPP (эти ссылки приведены в документации по уплотнению). Оба они являются открытым исходным кодом, если вы хотите сворачивать свои собственные, тогда я также хотел бы взглянуть на образец SDK «scan».