0
我嘗試了一種方法,以便不使用從主機到設備的數據傳輸。通常,我們使用一個循環將值分配給主機陣列中的元素,並將其傳送到設備。這對我在1D和2D陣列上工作正常。我試過的新方法是給內核中的數組元素賦值。我成功了一維數組。但是,對於2D陣列,結果爲0
。我的設備每塊可以支持(512,512)線程。輸出值可以達到長度= 22,但長度= 23時顯示爲'0'[22<sqrt(512)<23]
。根據[22<sqrt(512)<23]
,我可以看到只有22x22
線程正在使用。有什麼問題??這是爲什麼發生?使用threadIdx在內核中分配值
驗證碼:
const int Length=23;
主要功能:
int A[Length],B[Length],C[Length],D[Length],*Ad,*Bd;
int size=Length*sizeof(int);
cudaMalloc((void**)&Ad,size);
cudaMalloc((void**)&Bd,size);
dim3 dimGrid(1,1);
dim3 dimBlock(Length,Length);
FuncG<<<dimGrid,dimBlock>>>(Ad,Bd);
cudaMemcpy(C,Ad,size,cudaMemcpyDeviceToHost);
cudaMemcpy(D,Bd,size,cudaMemcpyDeviceToHost);
for(int i=0;i<Length;i++){
printf("%d %d\n",C[i],D[i]);
}
return 0;
核函數:
__global__ void FuncG(int *Ad,int *Bd){
int tx=threadIdx.x;
int ty=threadIdx.y;
Ad[tx]=tx;
Bd[ty]=ty;
}
我經歷的塊大小[百科](http://en.wikipedia.org/wiki/CUDA#Version_features_and_specifications) 。是(512,512,64)還是(512,1,1)? – Fr34K
每個尺寸最多可以分別爲512,512,64,但也可能是所有尺寸的乘積不能大於512. – tera
是否適用於blockIdx? – Fr34K