IBM XL/C 是不是在预处理器中表示 Altivec 支持?
Posted
技术标签:
【中文标题】IBM XL/C 是不是在预处理器中表示 Altivec 支持?【英文标题】:Does IBM XL/C signal Altivec support in the preprocessor?IBM XL/C 是否在预处理器中表示 Altivec 支持? 【发布时间】:2017-10-13 02:54:20 【问题描述】:我正在尝试确定何时激活某些 Altivec 代码路径。当我在-qaltivec
生效时检查预处理器宏时,我看不到相应的预处理器宏(见下文)。
我们的担心或恐惧是需要-qaltivec
和-DALTIVEC=1
或类似的。用户几乎从不阅读手册,因此它会为平台生成无穷无尽的问题和错误报告。如果 RTFM 能够发挥作用,它会在过去 50 年左右发生。
-qaltivec
生效时,XL/C 是否会向 Altivec 发出信号?如果不是,有没有其他方法可以推断出来?
提前致谢。
以下来自GCC111,这是一台Power7机器。我不确定为什么编译器声称不支持 Altivec。
$ xlC -qshowmacros -qaltivec -E adhoc.cpp.proto | sort | egrep -iv 'sync'
1506-1162 (W) The altivec option is not supported for the target architecture and is ignored.
"adhoc.cpp.proto", line 2.10: 1506-296 (S) #include file <iosfwd> not found.
"adhoc.cpp.proto", line 3.10: 1506-296 (S) #include file <string> not found.
#define _AIX 1
#define _AIX32 1
#define _AIX41 1
#define _AIX43 1
#define _AIX50 1
#define _AIX51 1
#define _AIX52 1
#define _AIX53 1
#define _AIX61 1
#define _AIX71 1
#define _ARCH_COM 1
#define _ARCH_PPC 1
#define _BIG_ENDIAN 1
#define _CHAR_UNSIGNED 1
#define _IBMR2 1
#define _ILP32 1
#define _LONG_LONG 1
#define _POWER 1
#define __ALIGN 1
#define __BASE_FILE__ "adhoc.cpp.proto"
#define __BIG_ENDIAN__ 1
#define __BOOL__ 1
#define __C99_BOOL 1
#define __C99_COMPLEX 1
#define __C99_COMPOUND_LITERAL 1
#define __C99_CPLUSCMT 1
#define __C99_DESIGNATED_INITIALIZER 1
#define __C99_DUP_TYPE_QUALIFIER 1
#define __C99_EMPTY_MACRO_ARGUMENTS 1
#define __C99_FLEXIBLE_ARRAY_MEMBER 1
#define __C99_HEX_FLOAT_CONST 1
#define __C99_INLINE 1
#define __C99_LLONG 1
#define __C99_MACRO_WITH_VA_ARGS 1
#define __C99_MAX_LINE_NUMBER 1
#define __C99_MIXED_DECL_AND_CODE 1
#define __C99_MIXED_STRING_CONCAT 1
#define __C99_NON_CONST_AGGR_INITIALIZER 1
#define __C99_NON_LVALUE_ARRAY_SUB 1
#define __C99_PRAGMA_OPERATOR 1
#define __C99_RESTRICT 1
#define __C99_STATIC_ARRAY_SIZE 1
#define __C99_STD_PRAGMAS 1
#define __C99_TGMATH 1
#define __C99_UCN 1
#define __C99_VAR_LEN_ARRAY 1
#define __C99__FUNC__ 1
#define __CHAR_UNSIGNED__ 1
#define __DIGRAPHS__ 1
#define __FENCE 1
#define __FUNCTION__ __FUNCTION__
#define __GCC_PROTO_OVERRIDES_KNR_DEF 1
#define __HHW_BIG_ENDIAN__ 1
#define __HHW_RS6000__ 1
#define __HOS_AIX__ 1
#define __IBMC_NORETURN 1
#define __IBMC_STATIC_ASSERT 1
#define __IBMC__ 1210
#define __IBM_ALIGNOF__ 1
#define __IBM_ATTRIBUTES 1
#define __IBM_COMPUTED_GOTO 1
#define __IBM_DOLLAR_IN_ID 1
#define __IBM_EXTENSION_KEYWORD 1
#define __IBM_GCC_ASM 1
#define __IBM_GCC__INLINE__ 1
#define __IBM_GENERALIZED_LVALUE 1
#define __IBM_INCLUDE_NEXT 1
#define __IBM_LABEL_VALUE 1
#define __IBM_LOCAL_LABEL 1
#define __IBM_MACRO_WITH_VA_ARGS 1
#define __IBM_NESTED_FUNCTION 1
#define __IBM_PP_PREDICATE 1
#define __IBM_PP_WARNING 1
#define __IBM_REGISTER_VARS 1
#define __IBM__IMAG__ 1
#define __IBM__REAL__ 1
#define __IBM__TYPEOF__ 1
#define __ILP32__ 1
#define __LONGDOUBLE64 1
#define __MATH__ 1
#define __PPC 1
#define __PPC__ 1
#define __SIZE_TYPE__ unsigned int
#define __STDC_HOSTED__ 1
#define __STDC_VERSION__ 199901L
#define __STDC__ 1
#define __STR__ 1
#define __THW_BIG_ENDIAN__ 1
#define __THW_PPC__ 1
#define __THW_RS6000__ 1
#define __TOS_AIX__ 1
#define __XLC121__ 1
#define __XLC13__ 1
#define __XLC_BUILTIN_VAARG__ 1
#define __alignof __alignof__
#define __const const
#define __const__ const
#define __powerpc 1
#define __powerpc__ 1
#define __signed signed
#define __signed__ signed
#define __typeof __typeof__
#define __unix 1
#define __unix__ 1
#define __volatile volatile
#define __volatile__ volatile
#define __xlC__ 0x0c01
#define __xlC_ver__ 0x00000000
#define __xlc__ "12.1.0.0"
【问题讨论】:
【参考方案1】:大多数编译器(gcc et al)自动定义的常用宏是__VEC__
(或者至少这是我通常在跨平台代码中用于测试AltiVec 的符号)。使用-maltivec
或-qaltivec
时xlc 的IBM claims that __ALTIVEC__
is also defined(参见“预定义宏”)。
【讨论】:
谢谢@Paul。我在IBM manual 中看到了__VEC__
,但它不存在,如上图所示。我真的不明白 XL C/C++ 声称 -qaltivec
是一个不受支持的选项。这对我来说毫无意义。但是为了公平起见,当我包含<altivec>
并尝试使用__vector
时,会出现未知类型的编译错误。所以编译器真的那个很困惑。
Altivec 仅在具有矢量单元的 CPU 上受支持。 AIX 上 XLC 中的默认 CPU 架构是 pwr4,这是操作系统所需的最低 CPU。由于 pwr4 没有向量单元,XLC 发出了您看到的错误。要解决此问题,请添加 -qarch=pwr7 或 -qarch=auto。以上是关于IBM XL/C 是不是在预处理器中表示 Altivec 支持?的主要内容,如果未能解决你的问题,请参考以下文章