境界でデータをアライメントすると、パフォーマンスが向上します。このため、インテル® コンパイラーは、境界でデータのアライメントを行おうとします。しかし、この結果、パフォーマンス問題が発生することがあります。
まず最初にコンパイラーを使用して最適化を試みるようにしてください。
パフォーマンス問題を回避するには、以下のアーキテクチャー別のガイドラインに従ってください。
IA-32、インテル® 64、IA-64 アーキテクチャー:
ちょうど 2n (例えば、1KB、2KB、4KB、16KB、32KB、64KB、128KB、512KB、1MB、2MB、4MB、8MB、その他) で区切られた大きな間隔でデータにアクセスしたり、データを作成しないでください。
メモリーアクセスがキャッシュライン (例えば、32 バイト、64 バイト、128 バイト) を超えないようにデータをアライメントします。
上記の規則に沿うように、__mm_malloc(size,alignment,[offset]) を使用して構造体を割り付けます。
IA-64 対応コンパイラーでアプリケーション・バイナリー・インターフェイス (ABI) を使用して、ITP ポインターが 16 バイトでアライメントされるようにします。
IA-32 アーキテクチャーおよびインテル® 64 アーキテクチャー
SIMD またはストリーミング SIMD 拡張命令レジスターのサイズに対応するようにデータをアライメントします。
__assume _aligned() または #pragma vector aligned のいずれかを使用してデータをアライメントするようにコンパイラーに指示します。
IA-64 アーキテクチャー:
パックされた構造体を使用しないようにします。
小さなデータ要素のポインターから大きなデータ要素のポインターへのキャストを行わないようにします。
パックされていないデータで計算を行って、必要な場合は、データが正しく出力されるように再パックします。
アライメントされていないデータへのポインターで __unaligned キーワードを使用して、構造体に 1 バイトずつアクセスするようにします。これは遅い代案です。
一般的に、キャッシュにデータを保持するほうが、アライメントされたデータを保持するよりもパフォーマンスに与える影響は少なくなります。上記の規則に沿った手法を使用するようにしてください。