arrays30 x 30的程序失败

这是CUDA架构上的矩阵乘法程序。 当数组大小为30 x 30时,此代码工作正常,但当大小较大时,输出为0的系列。 我正在使用Linux机器上托管的CUDA的标准ec2实例。 任何人都可以找出原因吗?

#include  #define SIZE 30 __global__ void matrix_multiply(float *input1,float *input2,float *output,int dimension){ int input1_index = threadIdx.x / dimension * dimension; int input2_index = threadIdx.x % dimension; int i=0; for( i =0; i <dimension; i++){ output[threadIdx.x] += input1[input1_index + i] * input2[input2_index + i * dimension]; } } int main(){ int i,j,natural_number=1; float input1[SIZE][SIZE],input2[SIZE][SIZE],result[SIZE][SIZE]={0}; float *c_input1,*c_input2,*c_result; for(i=0;i<SIZE;i++){ for(j=0;j<SIZE;j++){ input1[i][j]=input2[i][j]=natural_number++; } } cudaMalloc((void**)&c_input1,sizeof(input1)); cudaMalloc((void**)&c_input2,sizeof(input2)); cudaMalloc((void**)&c_result,sizeof(result)); cudaMemcpy(c_input1,input1,sizeof(input1),cudaMemcpyHostToDevice); cudaMemcpy(c_input2,input2,sizeof(input2),cudaMemcpyHostToDevice); cudaMemcpy(c_result,result,sizeof(result),cudaMemcpyHostToDevice); matrix_multiply<<>>(c_input1,c_input2,c_result,SIZE); if(cudaGetLastError()!=cudaSuccess){ printf("%s\n",cudaGetErrorString(cudaGetLastError())); } cudaMemcpy(result,c_result,sizeof(result),cudaMemcpyDeviceToHost); for(i=0;i<SIZE;i++){ for(j=0;j<SIZE;j++){ printf("%.2f ",result[i][j]); } printf("\n"); } cudaFree(c_input1); cudaFree(c_input2); cudaFree(c_result); return 0; } 

GPU上每块可能最多有1024个线程。 30 x 30 = 900,所以应该没问题,但是例如40 x 40会导致内核启动失败(带回家的消息:总是检查错误!)。

您可能想要考虑以不同方式组织数据,例如SIZE线程的SIZE块,然后将内核称为:

 matrix_multiply<<>>(c_input1,c_input2,c_result,SIZE); 

(显然你需要在内核代码中修改数组索引,例如使用块索引作为行,使用线程索引作为列。)

您正在使用大小为30×30的1个网格配置调用内核:

 matrix_multiply<<<1, SIZE * SIZE>>>(c_input1,c_input2,c_result,SIZE); 

没有足够的线程来处理更多。