【发布时间】:2015-09-15 17:33:03
【问题描述】:
据我了解,如果我设置了相应的编译器标志,大多数现代编译器会在适当的情况下自动使用 SIMD 指令进行循环。由于编译器只有在可以确定这样做不会改变程序语义的情况下才能使用向量化,所以在我确实知道它是安全的,但编译器出于各种原因认为它不安全的情况下,它不会使用向量化。
是否有可以在没有库的普通 C++ 中使用的显式矢量化指令,让我自己处理矢量化数据而不是依赖编译器?我想它看起来像这样:
double* dest;
const double* src1, src2;
// ...
for (uint32 i = 0; i < n; i += vectorization_size / sizeof(double))
{
vectorized_add(&dest[i], &src1[i], &src2[i]);
}
【问题讨论】:
-
如何编写代码让编译器知道它是安全的?
-
AFAIK,“标准 C++”中没有关于这些选项的内容。但我想微软 C++ 和 GCC/Clang 中都有“专有”选项/指令可以做到这一点。
-
目前标准 C++ 中没有这方面的内容,尽管标准委员会已经进行了一些讨论。目前,您需要使用平台提供的内在函数,这些内在函数不能跨 CPU 架构移植,只能在编译器之间移植。
标签: c++ vectorization