2016-11-10 9 views
3

32ビットマシンでは、1回のメモリリードサイクルでデータが4 bytesになります。
したがって、以下のバッファを読み取るには、下記の128 bytesのバッファを読み取るのに32リードサイクルが必要です。今
std :: alignasはどのようにプログラムのパフォーマンスを最適化しますか?

char buffer[128]; 

、下に述べたように、私はこのバッファを揃えているならば、私はどのようにそれを読むために、それはより速くなります知らせてくださいと仮定?

alignas(128) char buffer[128]; 

私は、メモリ読み出しサイクルが4バイトだけ残っていると仮定しています。

+0

オーバーアラインメントは、C++標準で動作するとは限りません。正確なプロセッサとコンパイラがこの質問に答える必要があります。 – Yakk

+0

関連:http://stackoverflow.com/questions/381244/purpose-of-memory-alignment – NathanOliver

+0

あなたは確認できません。* 32ビットマシンでは、1回のメモリリードサイクルで4バイトのデータが得られます。 SIMD命令を参照してください。 –

答えて

4

メモリアクセスに使用されるレジスタのサイズは、ストーリーの一部のみであり、他の部分は、キャッシュラインのサイズです。

キャッシュラインが64バイトで、char[128]が自然に配置されている場合、CPUは一般に3つの異なるキャッシュラインを操作する必要があります。 alignas(64)またはalignas(128)では、2つのキャッシュラインだけをタッチする必要があります。

メモリマップファイルまたはスワッピング条件で作業している場合、次のレベルのアライメントがメモリページのサイズに反映されます。これにより、4096または8192バイトのアライメントが必要になります。

しかし、指定されたアラインメントがコンパイラがとにかく使用する自然なアライメントよりも大きい場合、alignas()に有意な正の効果があることを真剣に疑っています。メモリ消費を大幅に増加させ、キャッシュライン/メモリページは最初に触れられます。小さなCPUのミスアライメントは、一部のCPUで大幅な減速を引き起こす可能性があるため、避ける必要があります。また、他の人にはまったく違法/不可能かもしれません。

したがって、真実は測定のみです:あなたが得ることができるすべてのスピードアップが必要な場合は、それを試し、ランタイム差異を測定し、それがうまくいくかどうかを確認してください。

1

32ビットマシンでは、1回のメモリリードサイクルで4バイトのデータが得られます。

これは簡単ではありません。 という用語「32ビットマシン」は既に広すぎて、多くのことを意味する可能性があります。 32bレジスタ(GPレジスタ?ALUレジスタ?アドレスレジスタ?)? 32bアドレスバス? 32bデータバス? 32b命令語サイズ?

および"メモリリード" CPU?キャッシュ? DMAチップ?

メモリが4バイト(4で揃えられます)のメモリが1サイクルでキャッシュなしで読み込まれるHWプラットフォームをお持ちの場合、alignas(128)は(alignas(4))の違いはありません。

関連する問題