2017-12-12 26 views
2

Power4マシンである古いPowerMac G5でテストしています。ビルドが失敗している:私はtypedefでは利用できるようにする必要があるとき、私はトラブル決定を抱えている「ベクトルロングロング」の可用性はどうですか?

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ビット整数も倍精度浮動もありません。 –

+0

Paulに感謝します。 Power4(Altivec)、Power7(アライメントされていないロード/ストア)、Power8(コア内の暗号)を区切ります。私は私の質問は、私たちは、64ビットタイプのPower4の代わりにPower5を使用する必要があると思いますか? – jww

+0

私は、POWERのどの世代がSIMD用の64ビット要素タイプを導入したのかよくわかりません - それを見つけるためにはいくつかの研究をする必要があります。明らかに、64ビット要素を使用する必要がある場合、G5でコードをテストすることはできません。 –

答えて

1

TL:DR:AltiVecを使用する場合、POWER7は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); 
} 

auto代わりにvector long longと、第2の機能は、2つの64ビット整数レジスタに復帰にコンパイル。)

-mvsxを追加する第2の関数をコンパイルすることができます。 -mcpu=power7を使用しても動作しますが、power6は動作しません。単一の命令にコンパイル定数と

source + asm on Godbolt (PowerPC64 gcc6.3)

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

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(スプラットスカラー)。しかし、ランタイム変数(例えば、関数arg)を使用すると、整数ストア/ベクトルロード/ベクトルスプラット(vec_splat組み込み関数のように)にコンパイルされます。どうやら、int-> vecのための命令は一つもありません。

vec_splat_s32と関連組み込みのみ定数小(5ビット)を受け入れるので、彼らは唯一のコンパイラは、対応するスプラット即時命令を使用することができる場合にはコンパイル。

このIntel SSE to PowerPC AltiVec migrationは大抵よく見えますが、それは間違っています(vec_splatsは符号付きバイトを表示すると主張しています)。

関連する問題