1

嗨,我尝试用 CUDA 创建一个单位矩阵,但输出只是:零

__global__ void initIdentityGPU(int *devMatrix, int numR, int numC) {

    int x = blockIdx.x;
    int y = blockIdx.y;

    int offset = x * y;

    for (int i = 0; i < x ; i++) {

        for (int j = 0; j < numR; j++) {
            if (i == j)
                devMatrix[offset] = 1;
            else
                devMatrix[offset] = 0;

        }

    }

}

为什么只放0?

4

1 回答 1

4

最简单的方法是:

__global__ void initIdentityGPU(int **devMatrix, int numR, int numC) {
    int x = blockDim.x*blockIdx.x + threadIdx.x;
    int y = blockDim.y*blockIdx.y + threadIdx.y;
    if(y < numR && x < numC) {
          if(x == y)
              devMatrix[y][x] = 1;
          else
              devMatrix[y][x] = 0;
    }
}

然后您将其启动为:

dim3 blockDim(BLOCK_DIM_X, BLOCK_DIM_Y);  
dim3 gridDim((numC + BLOCK_DIM_X - 1) / BLOCK_DIM_X, (numR + BLOCK_DIM_Y - 1) / BLOCK_DIM_Y);
initIdentityGPU<<<gridDim, blockDim>>>(matrix, numR, numC);

它只是运行与矩阵单元一样多的线程,每个线程获取其单元的坐标,并且在单元位于它分配的矩阵的对角线的情况下,1或者0以其他方式。请注意,代码未经测试。

于 2013-04-14T10:33:13.703 回答