2017-09-12 2 views
1

아래의 질문에 대해 제발 용서해주십시오. 우리는 GCC 4.8 (이상)과 IBM XL C/C++ 12 (이상)를 지원합니다. 우리는 또한 AIX 및 Linux에서 크고 작은 엔디안을 지원합니다. 컴파일러와 플랫폼으로 인해 코드가 상당히 엉망이되었습니다.작은 상수를 벡터에로드하는 방법은 무엇입니까?

상수 1을 VSX 레지스터에로드하려고합니다. 이것은 우리가 만들 수 있었던 코드이지만 너무 복잡하기 때문에 잘못되었습니다. XLC_VERSION, GCC_VERSIONLITTLE_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; 

+0

아, 각 벡터 슬롯에 1을로드하려고합니까? 아니면 하나만? –

+0

@ 제레미 - 단지 하나; 하나의 splat'd 아닙니다. 내가 겪고있는 문제는 엔디안 변환을 수동으로 처리해야한다는 것입니다. 예를 들어 ['rijndael.cpp' : 1152] (https://github.com/weidai11/cryptopp/blob/master/rijndael-simd.cpp#L1152)를 참조하십시오. 나는 덜 복잡하고 직관적 인 것을 좋아할 것이다. 컴파일하지 않는 문장과 같다. – jww

+0

@Jeremy - 믿거 나 말거나, AES/CTR 모드에서 실패한자가 테스트를 추적하는 데 6 시간을 보냈습니다. 'VectorType one = 1; '을 원했기 때문에'VectorType one = {1};'이라고 썼습니다. 리틀 엔디안 Linux 머신에서는 정상적으로 작동했지만 빅 엔디안 AIX 머신에서는 실패했습니다. 이제는 문제를 피하는 컨트롤을 추가하고 싶습니다. 이 질문은 내가 놓을 수있는 컨트롤을 찾고 미래에 문제가 나타나지 않도록하려는 것입니다. – jww

답변

2

귀하의 예는 벡터에 스칼라를 할당하려고합니다. 대신 벡터를 사용해보십시오. 16 문자 벡터의 경우,이는 다음과 같습니다

vector char one = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}; 

GCC-4.8이 괜찮 컴파일 할 것 같다; 나는 LE 4.8을 쓸모 없지만 적어도 빅 엔디안에서 일한다.

0: 10 41 03 0c  vspltisb v2,1 

LE와 gcc-5는 잘 동작한다.

0: 0c 03 41 10  vspltisb v2,1 
2

예 : here의 BCD_INIT 예를 확인하십시오. 매크로를 사용하여 벡터 초기화를 취소합니다.

vec_reve : vec_perm에 대한 구문 식 설탕입니다. 그것을 헤더 나 라이브러리 함수로 인라인 함수로 구현하고 그것을 가지고 있지 않은 컴파일러에 사용할 수 있습니다.

관련 문제