私はいくつかの高速数学計算を行う必要があるCでプログラムを書いています。インラインSSEアセンブリ命令を使用して、SIMDアクションを取得しています(パックされた倍精度浮動小数点数を使用)。LinuxでGCCを使用してコンパイルしています。
一部のデータをループする必要がある状況にあり、計算に定数係数を使用しています。ループ中はその要素を安全なレジスタに隠しておきたいので、毎回再ロードする必要はありません。
いくつかのコードで明確にするには:
struct vect2 {
fltpt x;
fltpt y;
}__attribute__((aligned(16))); /* Align on 16B boundary for SSE2 instructions */
typedef struct vect2 vect2_t;
void function()
{
/* get a specific value set up in xmm1, and keep it there for the
* rest of the loop. */
for( int i = 0, i<N; i++ ){
asm(
"Some calculations;"
"on an element of;"
"a data set.;"
"The value in xmm1;"
"is needed;"
);
}
}
「register」キーワードで何かしてみました。しかし、私が間違っていなければ、その構造体へのポインターしか(一般的なレジスターに)保持できないように見えます。これは、反復ごとに延期する必要があり、貴重な時間を無駄にします。
register vect2_t hVect asm("xmm1") = {h, h};
/* Gives error: data type of 'hVect' isn't suitable for a register */
register vect2_t *hVect2 asm("rax");
*hVect2 = (vect2_t){h,h};
/* Seems to work, but not what I'm looking for */
GCCがxmm1レジスタを変更しないと仮定するのは好きではありません。それは、「鼻から飛び出す悪魔」のようなものではありません:-)。だから私はこれを行うための適切な方法があることを望んでいます。