【发布时间】:2016-07-27 14:43:14
【问题描述】:
我今天的问题应该不是很复杂,但我根本找不到原因/解决方案。作为一个可重现的小例子,请考虑以下玩具 C 代码
#define _state_ 0
#if _state_ == 1
int foo(void) {return 1;}
#else
/* check GCC flags first
note that -mfma will automatically turn on -mavx, as shown by [gcc -mfma -dM -E - < /dev/null | egrep "SSE|AVX|FMA"]
so it is sufficient to check for -mfma only */
#ifndef __FMA__
#error "Please turn on GCC flag: -mfma"
#endif
#include <immintrin.h> /* All OK, compile C code */
void foo (double *A, double *B) {
__m256d A1_vec = _mm256_load_pd(A);
__m256d B_vec = _mm256_broadcast_sd(B);
__m256d C1_vec = A1_vec * B_vec;
}
#endif
我将编译这个test.c文件
gcc -fpic -O2 -c test.c
注意我没有打开 GCC 标志-mfma,所以#error 会被触发。我所期望的是,在 GCC 看到这个#error 之后,编译将立即停止,但这是我在 GCC 5.3 中得到的:
test.c:14:2: error: #error "Please turn on GCC flag: -mfma"
#error "Please turn on GCC flag: -mfma"
^
test.c: In function ‘foo’:
test.c:22:11: warning: AVX vector return without AVX enabled changes the ABI [-Wpsabi]
__m256d A1_vec = _mm256_load_pd(A);
^
GCC 确实停止了,但为什么它还在#error 之后接了一行?有什么解释吗?谢谢。
对于想尝试的人来说,有一些硬件要求。您需要带有 AVX 和 FMA 指令集的 x86-64。
【问题讨论】:
-
旧版本的 gcc 肯定会在
#error上中止编译,所以不清楚这是功能还是回归 -
通常认为编译器报告所有错误更有用,而不仅仅是第一个错误,因此您可以在再次编译之前修复所有问题。
-
不幸的是,当由于依赖而出现错误时,第一个错误可能会导致其他错误的级联,这可能很烦人。但你不能两全其美。
-
有一个 5yo feature request 来改变行为。
-
@Barmar
#error表示由于编译器配置出现问题,编码人员有意停止编译。就像编译时断言一样。任何后续消息都是无用的。
标签: c gcc compilation c-preprocessor avx