Я довольно новичок в CUDA, я пытался узнать, как выполняется индексация, переписывая базовый код с нуля. Сначала я начал с двумерных массивов, но это не сработало, поэтому сейчас я пытаюсь работать с простыми одномерными массивами, но все еще безуспешно.
Код довольно прост и прост:
__global__ void kernel(int *a, int*b){
int r= blockIdx.x*blockDim.x;
int c =threadIdx.x;
a[r+c] += b[r+c];
}
__global__ void init(int *a, int*b){
int r= blockIdx.x*blockDim.x;
int c =threadIdx.x;
a[r+c] = threadIdx.x;
b[r+c]= 1;
}
int main(){
int m = 5, n =5;
int *hst = (int*) malloc(sizeof(int)*m*n);
int *ad, *bd;
cudaMalloc(&ad, sizeof(int)*m*n);
cudaMalloc(&bd , sizeof(int)*m*n);
// dim3 grid(5,1,1), block()
init<<<m,n>>>(ad,bd);
kernel<<<m,n>>>(ad, bd);
cudaMemcpy( hst, ad, m*n,cudaMemcpyDeviceToHost );
for(int i=0 ; i< m*n ;i++)
{
cout<<hst[i]<<' ';
}
return 0;
}
Вот что я получаю:
1 2 3 4 5 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Пока это должно быть
1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5