我正在开发一个包含大量 SIMD 内在代码的代码库。现在我们有了 AVX2,我们仍然需要在不支持 AVX2 的处理器上运行 SIMD 代码,这将大大增加工作量。再加上 AVX2 shuffle 的 128 位车道交叉限制也使事情变得复杂。由于这些原因,现在是更多依赖自动矢量化的好时机。让我害怕的主要事情是一个简单的更改会杀死并行性的前景,以及在出现问题时调试自动矢量化代码的前景。
我已经用 g++ -O1 -g -ftree-vectorize 编译了以下内容,并尝试使用 GDB 逐步完成(有谁知道为什么 -ftree-vectorize 不适用于 -O0 ?)
float a[1000], b[1000], c[1000];
int main(int argc, char **argv)
{
for (int i = 0; i < argc; ++i)
c[i] = a[i] + b[i];
return 0;
}
但没有得到任何有意义的结果。例如,有时 i 的值表示 <optimized out>,而有时它会跳出 20。
似乎主要问题是很难将 SIMD 状态映射到原始 C 状态以进行调试。但实际上,能做到吗?