イントリンシックスでプログラミングしている間、次の問題が発生しました。 ローカル変数をロードまたは格納する場合、インライン関数でメモリ違反エラーが発生しますが、関数がインライン化されている場合に限ります。インライン関数でスタック変数が整列していない理由がわかりません。インライン関数でローカル変数が整列していません
私はGCC 4.9、5.3、6.1の多くの異なるバージョンでそれをテストしました。失敗した
例:
static inline foo(double *phi){
double localvar[4];
__m256d var = _mm256_load_pd (phi);
__m256d res = _mm256_mul_pd(var, var);
_mm256_store_pd (localvar, res); // <- failed due to memory violation
...
}
私は__attribute__ ((aligned (32)))
を追加したり、inline
を削除する場合、この関数は、それが必要のように動作します。
なぜ私は説明してくれますか(詳細をお聞かせください)、どうして一般的なローカル変数が__attribute__ ((aligned (32)))
とインライン関数のローカル変数を追加せずに整列するのですか?
偶然、私は思います。 – MikeCAT
ご使用の環境に追加のローカル変数を使用して[このコード](http://www.tutorialsp.com/compile_c_online.php?PID=0Bw_CjBb95KQMNFRDcGd3NmxDQmc)を試してください。配列はまだ整列していますか? – MikeCAT
標準Cでは、ローカル変数のアラインメントは必要ありません。あなたが望む結果を得るためには、あなたが言及したようなコンパイラ固有の拡張を使用する必要があります。 –