2017-07-04 5 views
3

私だけ__m256iのためである、_mm256_stream_load_si256()を見つけることができます。 __m256dをストリームロードする方法がないのですか?非時間ストリーミング・ロード組み込み関数(_mm256_stream_load_si256)の浮動小数点(__m256d)バージョンとは何ですか? AVX/AVX2で

次(積極的な鋳造)を行うための任意の障害物がある(私は、CPUのキャッシュを汚染することなく、それをロードしたいと思いますか)?

__m256d *pDest = /* ... */; 
__m256d *pSrc = /* ... */; 

/* ... */ 

const __m256i iWeight = _mm256_stream_load_si256(reinterpret_cast<const __m256i*>(pSrc)); 
const __m256d prior = _mm256_div_pd(*reinterpret_cast<const __m256d*>(&iWeight), divisor); 
_mm256_stream_pd(reinterpret_cast<double*>(pDest), prior); 
+0

__m256dと__m256iの違いは何ですか? –

+0

@MarekVitek、 '__m256d'は4つの' double'を含んでいます。 '__m256i'はuint8_t' /' int8_t' 32 '、16' uint16_t'/'int16_t'、8' uint32_t'/'int32_t'及び4 'uint64_t' /' int64_t'ための組合を含んでいます。したがって、これらは32バイト長であり、1 YMMレジスタを占有します。 –

答えて

5

(V)MOVNTDQA instructionから_mm256_stream_load_si256()固有相当します。これはのみ非一時的なロード命令であるので、これはあなたが浮動小数点データをロードしている場合でも、使用するを持ってものです。

(他の3つの非時間的な命令のみ格納を行う。(V)MOVNTDQ_mm256_stream_si256)は二重クワッドワード整数のためのものである、(V)MOVNTPS_mm256_stream_ps)はパック単精度浮動小数点値のためであり、そして(V)MOVNTPD_mm256_stream_pd)のためのものです)

__m256i*から__m256d*へのキャスト、またはその逆は安全です。これらは単なるビットであり、すべてがYMMレジスタに格納されています。私はこれらのタイプのキャストに問題があったコンパイラを見たことがありません。おそらく、結果として得られるアセンブリコードをチェックして、それが何かファンキーなことをしていないことを確かめるべきでしょう。あなたは、整数SIMD命令と浮動小数点SIMD命令を混在ドメイン・クロッシングのペナルティがある場合、それは問題になり

唯一の時間は、特定のプロセッサです。しかし、唯一のNT負荷は整数領域にあるので、実際には選択肢はありません。

すべてノンテンシャル命令(ロードとストア)には、のアライメント番地が必要です。

関連する問題