c - 数组 30 x 30 程序失败

标签 c cuda

这是 CUDA 架构上的矩阵乘法程序。 当数组大小为 30 x 30 时,这段代码工作正常,但当大小更大时,输出为一系列 0。 我正在为 Linux 机器上托管的 CUDA 使用标准的 ec2 实例。谁能找出原因?

#include <stdio.h>
#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<<<1,SIZE * SIZE>>>(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 上每个 block 可能最多有 1024 个线程。 30 x 30 = 900,所以应该没问题,但是例如40 x 40 会导致内核启动失败(关键信息:始终检查错误!)。

您可能想考虑以不同方式组织数据,例如SIZESIZE 线程 block ,然后将内核调用为:

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

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

关于c - 数组 30 x 30 程序失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12266048/

相关文章:

未调用 CUDA 内核函数

c++ - 将二维数组传递给 CUDA 设备并使用它

c++ - 将树展平为链表c++,没有指针

c - 在 C 程序中启动 matlab 代码的最有效方法

c - 指向函数的指针有什么用?

c++ - C或C++新手应该知道哪些库?

cuda - 在主机和 GPU 上添加 CUDA 的不同结果

c - 类型转换浮点值或使用 math.h floor* 函数?

c - 错误: expected identifier or ‘(’ before ‘TOKEN’

visual-c++ - 将 .cpp 文件中的 cuda 主机代码分开