我尝试了一种方法,以便不会使用从主机到设备的数据传输。通常,我们使用循环将值分配给Host数组中的元素,并将其传输到Device。这在1D和2D阵列上对我来说很好。我尝试的新方法是将值赋给内核中的数组元素。我成功完成了1D阵列。但是,对于2D数组,结果为0
。我的设备每个块可以支持(512,512)个线程。输出值精确到长度= 22但长度= 23 [22<sqrt(512)<23]
显示为“0”。根据{{1}},我可以看到只使用[22<sqrt(512)<23]
个线程。有什么问题??为什么会这样?
守则:
22x22
主要功能:
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;
答案 0 :(得分:2)
您的设备每个块只能支持512个线程。前两个线程块维度的最大维度是512.一个22x22块(484个线程)是合法的块大小,但是23x23块(529个线程)不是。
由于内核永远不会运行,因此输出为0。如果检查它,您会发现内核启动失败,执行配置错误无效。检查此类启动失败的规范方法如下:
FuncG<<<dimGrid,dimBlock>>>(Ad,Bd);
if (cudaPeekAtLastError() != cudaSuccess) {
// handle error.....
}