2


0

配列サイズの最適化

64ビットUNIX OSを使用している場合、アレイのサイズを8の倍数に定義する利点はありますか? 共有メモリからデータをロードするためにこの配列を使用するつもりです。 そのため、オペレーティングシステムとページサイズに依存関係が存在する場合があります。

3 Answer


8


関係ありません。 コンパイラーは、そこにパディングが必要かどうかを知っているので、判断してください。 推測作業のためにコードを汚さないでください。

プログラムを_最初に_動作させてから、プロファイラーでパフォーマンスを気にします。


2


ヒープ上の配列を動的に割り当てると仮定すると、mallocの内部割り当てアルゴリズムがカーネルへの実際のメモリ要求から何らかの抽象化を行うと仮定するのは公平です。 つまり、malloc()呼び出しとlibcのbrk()(またはmmap())システム呼び出しの間に直接の関係がある場合とない場合があります。

mallocのmanページには、これに関する詳細があります。

したがって、メモリ使用量に関しては、8バイトの倍数で割り当てるかどうかは実際には重要ではないことを示唆する傾向があります.mallocはおそらくあなたの下で別の(そして賢明な)何かをしているからです。

プログラムのパフォーマンスの観点から、メモリ内のデータ構造の割り当ては、キャッシュのパフォーマンスに大きな影響を与える可能性があります。 ただし、最終的には、アプリケーションのプロファイルを作成して、キャッシュのパフォーマンスを改善できるかどうかを確認する必要があります。 コードを記述する際にこれを最適化するための厳格なルールがあるとは思わない。

メモリとLinuxの詳細に興味がある場合、Ulrich Drepperは数年前にこのテーマについてLWNの素晴らしいシリーズを書きました。


2


メモリアクセスのアライメントなどについては、内部環境/ libcがダイナミックアロケーションをどのようにアライメントするかが重要です。 サイズが整列している場合、特定の方法で配列を整列させることは保証されません。 多くのアロケーターは、ある値(マシンワードの約2xまたは4xサイズ)にアラインされたメモリブロックを返すため、アラインメントを気にする場所ではありません。

重要なことをいくつか覚えています。

  1. ベクトル演算や展開されたループを使用して、 そのため、プログラムが割り当てられた領域を超えないようにするために、パディングが必要になる場合があります。 (ただし、ベクターエンジンが標準のC実装が提供する以上のアライメントを必要とする場合、単純なmalloc()とは別の方法でメモリを割り当てる必要があります)。

  2. ほとんどのメモリアロケーターは、サービス情報を保存します(例: 割り当てられた 割り当てられた領域の横のブロックサイズ)、および空きから切り取られたメモリの合計サイズはわずかに大きくなります。 Siは、いくつかの標準の割り当てブロック(メモリページなど)に領域を密にパックするために、ラウンド値よりわずかに小さいサイズの領域を割り当てるのが最善かもしれません。 たとえば、CPUに4kページがある場合、ページには3つの1024バイトブロックのみが含まれますが、4つの1008バイト(= 1024-8)ブロックが含まれます。

  3. また、多くのメモリアロケーターには、ブロックサイズのしきい値があります。 メモリはヒープから割り当てられますが、その上でメモリはハードウェアページ全体によってOS VMディスパッチャから直接取得されるため、ページ境界に揃えられます。 この場合、ページ全体を取得するには、割り当てサイズをページサイズに切り上げる必要がある場合があります。

他にもいくつかの問題があるかもしれませんが、私はそれらを覚えていません。