2011-09-18 1 views
3

Я вектор называется d_index рассчитывается в памяти устройства CUDA, и я хочу изменить только одно значение, как это ...Cuda Изменение одного Значение в массиве

d_index[columnsA-rowsA]=columnsA; 

Как я могу сделать это без необходимости скопировать его в системную память и затем вернуться в память устройства?

+5

Запустив ядро ​​только с одним потоком, передав массив и значение и установив это значение в код ядра. Может быть, вы можете уточнить, где именно лежит ваша проблема. –

ответ

2

Вы можете либо вызвать ядро ​​на <<<1,1>>> сетке, которая изменяет только нужный элемент:

__global__ void change_elem(int *arr, int idx, int val) { 
    arr[idx] = val; 
} 
// .... 
// Somewhere in CPU code 
change_elem<<<1,1>>>(d_index, columnsA-rowsA, columnsA); 

, или использовать что-то вроде:

int tmp = columnsA; 
cudaMemcpy(&d_index[columnsA-rowsA], &tmp, sizeof(int), cudaMemcpyHostToDevice); 

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

1

Host (CPU) код не может непосредственно получить доступ к памяти устройства, так что у вас есть два варианта:

  • Запуск ядра одного потока (например, update_array<<<1,1>>>(index, value))
  • Использование cudaMemcpy() к месту
  • Используйте thrust device_vector

Конечно, обновление одного значения в массиве очень неэффективно, надеюсь, вы рассмотрели, или возможно, этого можно было бы избежать? Например, можете ли вы обновить массив как часть кода графического процессора?

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