名字不能取太长 2025-05-12 01:16 采纳率: 75%
浏览 11
已结题

关于一维数组存储的矩阵转置问题

在《CUDA C编程权威指南》第155页给出了CPU端的矩阵转置代码,如下所示

void transposeHost(float* out, float* in, const int nx, const int ny) {
    for (int iy = 0; iy < ny; ++iy) {
        for (int ix = 0; ix < nx; ++ix) {
            out[ix * ny + iy] = in[iy * nx + ix];
        }
    }
}

但是我发现该代码只能对方阵的转置有效,我的测试如下:

int main() {
    const int nx = 3; 
    const int ny = 4; 
    float in[12] = { 0,1,2,3,4,5,6,7,8,9,10,11 };
    float out[12];

    transposeHost(out, in, nx, ny);

    std::cout << "转置后的输出:";
    for (int i = 0; i < 12; ++i) {
        std::cout << out[i] << " ";
    }
    std::cout << std::endl;

    return 0;
}

以上这个3行4列的矩阵就不能成功转置,然而换成以下这个2x2的方阵就可以:

int main() {
    const int nx = 2; 
    const int ny = 2; 
    float in[4] = { 0,1,2,3};
    float out[4];

    transposeHost(out, in, nx, ny);

    std::cout << "转置后的输出:";
    for (int i = 0; i < 4; ++i) {
        std::cout << out[i] << " ";
    }
    std::cout << std::endl;

    return 0;
}

请问这是为什么?

  • 写回答

5条回答 默认 最新

  • a5156520 2025-05-13 08:57
    关注

    根据参考链接,好像是因为作者为了简单起见,只考虑了边长为32的整数倍的1024x1024的方阵。
    参考链接:
    https://zhuanlan.zhihu.com/p/568769940
    https://zhuanlan.zhihu.com/p/628911759

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 5月22日
  • 已采纳回答 5月14日
  • 创建了问题 5月12日