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