Может быть полезно что-то подобное:
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 и т. Д.
Измерение строк должно быть четным числом, очевидно из вашей задачи (добавление пар попарно).
закодировано в браузере, не проверено, может содержать ошибки