Cuda Изменить одно значение в массиве - PullRequest
3 голосов
/ 18 сентября 2011

У меня есть вектор с именем d_index, вычисленный в памяти устройства CUDA, и я хочу изменить только одно значение, например, вот так ...

d_index[columnsA-rowsA]=columnsA;

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

Ответы [ 3 ]

2 голосов
/ 19 сентября 2011

Вы можете вызвать ядро ​​в сетке <<<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 голос
/ 19 сентября 2011

Код хоста (ЦП) не может напрямую обращаться к памяти устройства, поэтому у вас есть два варианта:

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

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

0 голосов
/ 03 июня 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...