gpt4 book ai didi

c - 这种指针和循环的组合有什么好处吗?

转载 作者:太空宇宙 更新时间:2023-11-04 00:56:39 25 4
gpt4 key购买 nike

我正在研究 Cheng 的 CUDA C Programming,并遇到了这段代码:

void sumMatrixOnHost (float *A, float *B, float *C, const int nx, const int ny) {
float *ia = A;
float *ib = B;
float *ic = C;
for (int iy=0; iy<ny; iy++) {
for (int ix=0; ix<nx; ix++) {
ic[ix] = ia[ix] + ib[ix];
}
ia += nx; ib += nx; ic += nx;
}
}

这用于矩阵加法,其中矩阵以行优先格式存储。

据我了解,内部 for 循环迭代一行并执行元素添加,然后使用外部 for 循环将指针递增到下一行的开头。

为什么这种方法比在整个矩阵上使用指针更好,即

for (int i=0; i<ny*nx; i++) {
ic[i] = ia[i] + ib[i];
}

或双重 for 循环,即

for (int iy=0; iy<ny; iy++) {
for (int ix=0; ix<nx; ix++) {
ic[iy*nx+ix] = ia[iy*nx+ix] + ib[iy*nx+ix];
}
}

这与编译器如何优化它有关吗?

最佳答案

最简单的方法,永远是最好的方法:

for (int i=0; i<ny*nx; i++) {
C[i] = A[i] + B[i];
}

这将比第一个解决方案更快。按行拆分矩阵的问题在于向量化器将执行以下操作:

  • 以 32 字节(YMM 的大小)为一组处理行
  • 处理行末剩余的少量值。
  • 现在对每一行重复!

但是,如果您使用单个循环执行此操作,则生成的代码将是:

  • 以 32 字节(YMM 的大小)为一组处理所有数据
  • 处理矩阵末尾未对齐到 32 字节 block 的剩余少数值。

第一个版本只是添加了无意义的代码来处理内循环。这些代码都不需要,它只是破坏了向量化整个矩阵的能力。

关于c - 这种指针和循环的组合有什么好处吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58723455/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com