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