предположим, у меня есть следующий серийный номер C:
int add(int* a, int* b, int n)
{
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
a[i][j]+=b[i][j];
}
}
return 0;
}
Я думаю, что лучший способ паралелизировать это понять, что это проблема 2D, и использовать блоки 2D потоков согласно ядру CUDA - вложено в цикл
Имея это в виду, я начал писать свой cuda kernal следующим образом:
__global__ void calc(int **A, int **B, int n)
{
int i= blockIdx.x * blockDim.x + threadIdx.x;
int j= blockIdx.y * blockDim.y + threadIdx.y;
if (i>=n || j>=n)
return;
A[i][j]+=B[i][j];
}
nvcc говорит мне, что:
./addm.cu(13): Warning: Cannot tell what pointer points to, assuming global memory space
./addm.cu(13): Warning: Cannot tell what pointer points to, assuming global memory space
./addm.cu(13): Warning: Cannot tell what pointer points to, assuming global memory space
1) Я правильно со своей философией?
2) Я думаю, что понимаю блоки, потоки и т. Д., Но я не понимаю, что
int i= blockIdx.x * blockDim.x + threadIdx.x;
int j= blockIdx.y * blockDim.y + threadIdx.y;
делает
3) Это самый эффективный / самый быстрый способ выполнения операций над двумерным массивом в целом? т.е. не просто добавление матрицы, это может быть любая операция «элемент за элементом».
4) Смогу ли я позвонить с Matlab? обычно это уродство, когда прототип имеет форму type** var
Спасибо, ребята