2017-12-12 43 views
2

Power4 기기 인 이전 PowerMac G5에서 테스트를하고 있습니다. 빌드가 실패 :'vector long long'의 가용성은 무엇입니까?

typedef __vector unsigned long long uint64x2_p8; 

나는 문제가 나는 형식 정의를 사용할 수 있도록시기를 결정하는 데 : 때문에

$ make 
... 
g++ -DNDEBUG -g2 -O3 -mcpu=power4 -maltivec -c ppc-simd.cpp 
ppc-crypto.h:36: error: use of 'long long' in AltiVec types is invalid 
make: *** [ppc-simd.o] Error 1 

실패입니다.

$ gcc -mcpu=power4 -maltivec -dM -E - </dev/null | sort | egrep -i -E 'power|ARCH' 
#define _ARCH_PPC 1 
#define _ARCH_PPC64 1 
#define __POWERPC__ 1 

OpenPOWER | 6.1. Vector Data Types 매뉴얼은 벡터 데이터 유형에 대한 좋은 정보를 가지고 있지만, vector long long를 사용할 수있는 경우는 설명하지 않습니다 : -mcpu=power4 -maltivec으로 기계는 64 비트 가용성을보고합니다.

__vector unsigned long long의 가용성은 무엇입니까? typedef는 언제 사용할 수 있습니까?

+1

G5는 64 비트 * 아키텍처 *를 가지고 있지만 AltiVec은 그 당시의 64 비트 벡터 요소를 지원하지 않았으므로 64 비트 int도 배정도 부동입니다. –

+0

폴 감사합니다. 우리는 Power4 (Altivec), Power7 (정렬되지 않은로드/저장) 및 Power8 (코어 내 암호화)에 코드를 분할합니다. 내 질문에 우리는 64 비트 유형의 Power4 대신 Power5를 사용해야합니까? – jww

+0

POWER의 어떤 세대가 SIMD 용 64 비트 요소 유형을 소개했는지 모르겠습니다.이를 찾으려면 조사를해야합니다. 물론 64 비트 요소를 사용해야하는 경우 G5에서 코드를 테스트 할 수 없습니다. –

답변

1

TL : DR : POWER7이 AltiVec을 사용하는 64 비트 요소 크기의 최소 요구 사항 인 것처럼 보입니다. 이것은 VSX (Vector Scalar Extension)의 일부로 Wikipedia는 POWER7에서 처음 확인되었습니다.


그것은 GCC는 그것이 무엇을하고 있는지 알고, 가장 낮은 필요한 -mcpu= 요구 사항 64 비트 요소 크기의 벡터 내장을 가능하게하는 것이 매우 가능성이 높습니다.

#include <altivec.h> 

auto vec32(void) {  // compiles with your options: Power4 
    return vec_splats((int) 1); 
} 

// gcc error: use of 'long long' in AltiVec types is invalid without -mvsx 
vector long long vec64(void) { 
    return vec_splats((long long) 1); 
} 

(대신 vector long longauto으로는, 2 차 함수는 두 개의 64 비트 정수 레지스터에서 반환에 컴파일합니다.)

추가 -mvsx는 2 차 함수 컴파일을 할 수 있습니다. -mcpu=power7도 사용하지만 power6는 작동하지 않습니다. 단일 명령어로 컴파일 상수와

vec64(): # -O3 -mcpu=power7 -maltivec -mregnames 
.LCF2: 
0: addis 2,12,[email protected] 
    addi 2,2,[email protected] 
    addis %r9,%r2,[email protected]@ha 
    addi %r9,%r9,[email protected]@l  # PC-relative addressing for static constant, I think. 
    lxvd2x %vs34,0,%r9   # vector load? 
    xxpermdi %vs34,%vs34,%vs34,2 
    blr 


.LC0: # in .rodata 
    .quad 1 
    .quad 1 

그리고 BTW, vec_splats (플랫 스칼라)

# with auto without VSX: 
vec64():  # -O3 -mcpu=power4 -maltivec -mregnames 
    li %r4,1 
    li %r3,1 
    blr 

source + asm on Godbolt (PowerPC64 gcc6.3)

. 그러나 런타임 변수 (예 : 함수 arg)를 사용하면 정수 저장/벡터로드/벡터 표시 (예 : vec_splat 내장)로 컴파일됩니다. 분명히 int-> vec에 대한 명령어는 하나도 없습니다.

vec_splat_s32 관련 내장 일정한 작은 (5 비트)를 수용하므로 전용 컴파일러 대응 플랫 즉각적인 지시를 사용할 수있는 경우에 컴파일.

Intel SSE to PowerPC AltiVec migration은 대부분 잘 보이지만 잘못되었습니다 (vec_splats은 부호있는 바이트를 표시합니다).