Добавить несколько векторов одновременно в CUDA - PullRequest
0 голосов
/ 12 апреля 2019

Я хочу спроектировать ядро ​​для одновременного добавления пар строк матриц, но я не знаю, как это сделать.

Например, у меня есть матрица данных, размер которой (512, 1024), и я хочу добавить ее пары строк (row1 + row2, row3 + row4, ..., row511 + row512) одновременно.

Причина, по которой я собираюсь сделать это, просто для экономии времени.

Не могли бы вы дать мне совет? Спасибо!

1 Ответ

1 голос
/ 13 апреля 2019

Может быть полезно что-то подобное:

const int width = 1024;
const int rows = 512;
template <typename T>
__global__ void row_add(const T * __restrict__ din, T * __restrict__ dout){
  int idx = width*2*blockIdx.x + threadIdx.x;
  if (dout == din)
    dout[idx] += dout[idx+width];
  else
    dout[idx-blockIdx.x*width] = din[idx]+din[idx+width];
}

Это зависит от ширины, равной 1024 или меньше.Вы бы запустили его так:

row_add<<<rows/2, width>>>(d_in, d_out);

Если вы передадите ему разные указатели для d_in и d_out, он будет предполагать, что вы хотите, чтобы вывод записывался последовательно в отдельный массив.Если вы передадите ему один и тот же указатель для d_in и d_out, он будет предполагать, что вы хотите, чтобы результаты строки 0 + 1 записывались в строку 0, результаты строки 2 + 3 записывались в строку 2 и т. Д.

Измерение строк должно быть четным числом, очевидно из вашей задачи (добавление пар попарно).

закодировано в браузере, не проверено, может содержать ошибки

...