6

xmmレジスタにロードされる2つのアラインされていない8バイトチャンクへの2つのポインタがあります。可能であれば、組み込み関数を使用します。そして、可能であれば、補助レジスタを使用せずに。ピンなし。(SSSEコア2)

4

2 に答える 2

3

msvc 仕様から、次のことができるように見えます。

__m128d xx;                   // an uninitialised xmm register 
xx = _mm_loadh_pd(xx, ptra);  // load the higher 64 bits from (unaligned) ptra
xx = _mm_loadl_pd(xx, ptrb);  // load the lower 64 bits from (unaligned) ptrb

アラインされていないストレージからのロード(私の経験では)は、アラインされたポインターからのロードよりも非常に遅いので、本当に高いパフォーマンスが必要な場合は、このタイプの操作をあまり頻繁に実行したくないでしょう。

お役に立てれば。

于 2011-08-27T23:27:41.913 に答える
2

アラインされていないアクセスは、アラインされたアクセスよりもはるかに低速です(少なくともネハレム以前)。必要なアラインされていない64ビットワードを含むアラインされた128ビットワードをロードし、それらをシャッフルして目的の結果を得ると、速度が向上する場合があります。

仮定:

  • 128ワード全体へのメモリ読み取りアクセス権があります
  • 64ビットワードは少なくとも32ビット境界に配置されます

例(テストされていません)

int aoff = ptra & 15;
int boff = ptrb & 15;
__m128 va = _mm_load_ps( (char*)ptra - aoff ); 
__m128 vb = _mm_load_ps( (char*)ptrb - boff ); 

switch ( (aoff<<4) | boff ) 
{
    case 0:  _mm_shuffle_ps(va,vb, ...

ケースの数は、64ビットアライメントを想定できるかどうかによって異なります

于 2011-08-30T14:06:47.373 に答える