2017-10-13 86 views
2

我想確定何時激活一些Altivec代碼路徑。當我檢查-qaltivec生效時的預處理器宏時,我看不到相應的預處理器宏(請參見下文)。IBM XL/C在預處理器中是否支持Altivec?

我們擔心或恐懼的是需要-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" 

回答

2

通常的宏大多數編譯器(GCC )自動定義爲__VEC__(或至少是這種符號我通常使用在跨平臺的代碼,以測試的AltiVec)。當使用-maltivec-qaltivec時,用於xlc的IBM claims that __ALTIVEC__ is also defined(參見「預定義的宏」)。

+1

謝謝@保羅。我在[IBM手冊](https://www-01.ibm.com/support/docview.wss?uid=swg27024811)中看到了'__VEC__',但它不存在,如上所示。我真的不明白XL C/C++聲稱'-qaltivec'是一個不受支持的選項。這對我來說毫無意義。但是爲了公平地編譯器,當我包含''並嘗試使用'__vector'時,編譯未知類型的錯誤。所以編譯器真的很困惑。 – jww

+2

Altivec僅在具有矢量單位的CPU上受支持。 AIX上XLC的默認CPU架構是pwr4,它是操作系統所需的最低CPU。由於pwr4沒有矢量單位,XLC發佈了您看到的錯誤。要解決這個問題,請添加-qarch = pwr7或-qarch = auto。 –