次の質問には答えが古いしかし、関連、およびユーザーからのコメントされたマルク・Glisseは十分に議論されていない可能性があり、この問題に対する17 ++ C以来の新たなアプローチがあることを示唆しています。
すべてのデータにアクセスしながら、SIMDでアライメントされたメモリを適切に動作させようとしています。
Intelでは、タイプのfloatベクトルを作成し__m256
、サイズを8分の1に削減すると、メモリが整列されます。
例えば std::vector<__m256> mvec_a((N*M)/8);
少しハックな方法で、ベクトル要素へのポインタを浮動小数点にキャストできます。これにより、個々の浮動小数点値にアクセスできます。
代わりに、私std::vector<float>
はを正しく調整して、__m256
segfaultingなしで他のSIMDタイプにロードできるようにしたいと思います。
私はaligned_allocを調べてきました。
これにより、正しく整列されたCスタイルの配列が得られます。
auto align_sz = static_cast<std::size_t> (32);
float* marr_a = (float*)aligned_alloc(align_sz, N*M*sizeof(float));
ただし、これをどのように行うかわかりませんstd::vector<float>
。のstd::vector<float>
所有権を与えるmarr_a
ことは可能ではないようです。
カスタムアロケーターを作成する必要があるという提案をいくつか見ましたが、これは多くの作業のように思われ、おそらく最新のC ++にはもっと良い方法がありますか?
_mm256_loadu_ps(&vec[i])
た場合のキャッシュライン分割による潜在的な速度低下なし。デフォルトのチューニングオプションで、GCCはなおものの(分割256ビットのロード/ストアを保証しませ整列 vmovups XMM / vinsertf128に。だから、ある使用する利点_mm256_load
を超えるloadu
あなたが心配している場合はどのようにGCCにあなたのコードのコンパイル誰か忘れた場合に使用-mtune=...
または-march=
オプション。)