아래의 질문에 대해 제발 용서해주십시오. 우리는 GCC 4.8 (이상)과 IBM XL C/C++ 12 (이상)를 지원합니다. 우리는 또한 AIX 및 Linux에서 크고 작은 엔디안을 지원합니다. 컴파일러와 플랫폼으로 인해 코드가 상당히 엉망이되었습니다.작은 상수를 벡터에로드하는 방법은 무엇입니까?
상수 1
을 VSX 레지스터에로드하려고합니다. 이것은 우리가 만들 수 있었던 코드이지만 너무 복잡하기 때문에 잘못되었습니다. XLC_VERSION
, GCC_VERSION
및 LITTLE_ENDIAN
매크로는 일반적인 의미를 갖기 때문에 매크로로 이어지는 추가 전 처리기 매크로가 생략되었습니다.
typedef __vector unsigned char uint8x16_p8;
typedef __vector unsigned long long uint64x2_p8;
#if defined(XLC_VERSION)
typedef uint8x16_p8 VectorType;
#elif defined(GCC_VERSION)
typedef uint64x2_p8 VectorType;
#endif
#if defined(LITTLE_ENDIAN)
const VectorType one = {1};
#else
const VectorType one = (VectorType)((uint64x2_p8){0,1});
#endif
XL C/C++은 모든 데이터 배열을 지원하며 풍부한 API 세트를 가지고 있습니다. IBM 컴파일러는 이해하기 어려운 경고 및 오류를 생성하지 않을 때 사용할 수있는 산들 바람입니다.
4.8로 돌아가는 GCC는 64x2 배열 만 지원하며 API의 하위 집합 만 갖습니다. 예를 들어, GCC에는 8x16 배치의 IBM API가 누락되어 있으며 GCC에는 vec_reve
이 없습니다 (이는 엔디안 취소를 쉽게 만듭니다). 내가 정말하고 싶은
이 같은이며, 그것은 어디에서나 "그냥 작동"한하지만 컴파일에 실패 : 벡터에 작은 상수를로드 할 수있는 덜 복잡한 방법은
VectorType one = 1;
있는가 레지스터?
VectorType one = 1;
의
아, 각 벡터 슬롯에 1을로드하려고합니까? 아니면 하나만? –
@ 제레미 - 단지 하나; 하나의 splat'd 아닙니다. 내가 겪고있는 문제는 엔디안 변환을 수동으로 처리해야한다는 것입니다. 예를 들어 ['rijndael.cpp' : 1152] (https://github.com/weidai11/cryptopp/blob/master/rijndael-simd.cpp#L1152)를 참조하십시오. 나는 덜 복잡하고 직관적 인 것을 좋아할 것이다. 컴파일하지 않는 문장과 같다. – jww
@Jeremy - 믿거 나 말거나, AES/CTR 모드에서 실패한자가 테스트를 추적하는 데 6 시간을 보냈습니다. 'VectorType one = 1; '을 원했기 때문에'VectorType one = {1};'이라고 썼습니다. 리틀 엔디안 Linux 머신에서는 정상적으로 작동했지만 빅 엔디안 AIX 머신에서는 실패했습니다. 이제는 문제를 피하는 컨트롤을 추가하고 싶습니다. 이 질문은 내가 놓을 수있는 컨트롤을 찾고 미래에 문제가 나타나지 않도록하려는 것입니다. – jww