2016-04-10 15 views
1

いくつかのメモリおよびCPU集約タスクを検討してください。
例:タスクブロック:メモリから16バイトを読み取り、CPUジョブを実行します。次に、メモリに書き戻します。
このタスクブロックは、各コアが1つのタスクブロックを実行できるという意味で並列化できます。
例:8CPUには8×16バイトのキャッシュが必要ですが、同時に実行する必要があります。GolangでCPUキャッシュを使用することはできますか?

答えて

2

はい、マシン上で実行されている他のコードと同様、すべてCPUキャッシュを使用します。

キャッシュを最も効率的に使用するようにアプリケーションをコーディングする方法を説明するのは、あまりにも広い質問です。 Go Benchmarksを設定し、コードをリファクタリングして時間を比較することを強くお勧めします。 (VM内のベンチマークは行わないでください - どのプラットフォームでも種類は異なりますが、Goのベンチマークには十分な時計がありません。

アプリケーションをコード化する能力がすべてになり、そのCPUキャッシュのを効率的に使用します。これは、変数の使い方、更新頻度、スタック上のGC、スタック上のGC数、頻度などの幅広い話題です。

正しい方向に向ける1つの小さな例効率的なL1およびL2キャッシュ開発についてもっと読む...

L1キャッシュは64ビットの行を使用します。通常、4x16bit Int16を格納する場合、スタックに割り当てられ、ほとんどすべてが同じ行のキャッシュに格納されます。

Int16のいずれかを更新したいとしますか? CPUキャッシュは行の一部を更新できません。行全体を無効にし、以前の3つのInt16と新しい更新値で新しいキャッシュ行を割り当てる必要があります。

非常に非効率です。

この問題の解決策の1つは、Int64sを使用することです。この場合、CPUキャッシュは1行を無効にしますが、他の3つはキャッシュに保存して、高速読み込みを行います。もっとプッシュやポップをやっていますか?

また、あなたのユースケースに大きく依存します。これらの4つのint(例えば、ミューテックスロック)の多くのコンテキスト切り替えを使用していると、処理が遅くなることさえあります。その場合、それは最適化するための全く別の問題です。

スタックとヒープの高周波スケーリングとメモット割り当てを読み出すことをお勧めします。

関連する問題