我有一小段测试代码,它使用AVX指令计算两个矢量的点积和第三个矢量(下面的点C和B点C)。它还添加了两个产品,但这只是为了让函数为这个例子返回一些东西。
#include <iostream>
#include <immintrin.h>
double compute(const double *x)
{
__m256d A = _mm256_loadu_pd(x);
__m256d B = _mm256_loadu_pd(x + 4);
__m256d C = _mm256_loadu_pd(x + 8);
__m256d c1 = _mm256_mul_pd(A, C);
__m256d c2 = _mm256_mul_pd(B, C);
__m256d tmp = _mm256_hadd_pd(c1, c2);
__m128d lo = _mm256_extractf128_pd(tmp, 0);
__m128d hi = _mm256_extractf128_pd(tmp, 1);
__m128d dotp = _mm_add_pd(lo, hi);
double y[2];
_mm_store_pd(y, dotp);
return y[0] + y[1];
}
int main(int argc, char *argv[])
{
const double v[12] = {0.3, 2.9, 1.3, 4.0, -1.0, -2.1, -3.0, -4.0, 0.0, 2.0, 1.3, 1.2};
double x = 0;
std::cout << "AVX" << std::endl;
x = compute(v);
std::cout << "x = " << x << std::endl;
return 0;
}
当我编译为
时clang++ -O3 -mavx main.cc -o main
一切正常。如果我启用链接时间优化:
clang++ -flto -O3 -mavx main.cc -o main
我收到以下错误&#34; LLVM ERROR:不知道如何拆分此运算符的结果!&#34;。我已将罪魁祸首缩小到_mm256_hadd_pd
陈述。如果用例如_m256_add_pd链接时间优化再次起作用。我意识到这是使用链接时优化的一个愚蠢的例子,但是在链接时优化非常有用的不同环境中出现错误。
有谁能解释这里发生了什么?