このシナリオでは:
別のスレッドで、ネットワーク経由で約 1MB を TCP 経由のバッファに受け取ります。
このバッファを解凍すると、約 2MB のデータが生成されます。
私がソースを所有している同じ動的にリンクされたライブラリ関数への2 つの呼び出し。基本的には、NEON をサポートする FFTW 3.3.3 を使用した一連の FFT です。FFT の最初のセットはコールドで、2 番目のセットはホットです。
コールド ランは、ホット ランよりも約 200 ミリ秒遅くなります。
- コールド: 570 ミリ秒
- ホット: 260 ミリ秒
1.) と 2.) がまったく同じデータのファイルからの読み取りに置き換えられた場合、ホット ランとコールド ランは同等に高速になります。
ネットワーク データを約 200K に減らし、圧縮解除されたデータを 400K に減らすと、パフォーマンスはコールドとホットで同じになります。
2.)の直後に L2 フラッシュ* を実行すると、コールド パフォーマンスが向上し、ホット パフォーマンスと同じになります。私はこれを理解していません。多くのコンパイラ オプションを変更しようとしましたが、オプティマイザが使用されている限り、この動作が見られます。
フラッシュするキャッシュが少ないと、コールド ランのパフォーマンスは比例して悪化します。
*これは、1MB L2 キャッシュをフラッシュするために使用しているコードです。
const size_t cache_size = 1024 * 1024;
char *cache = new char[cache_size];
srand(1);
for (size_t dc = 1; dc < cache_size; ++dc)
{
cache[dc] = cache[dc - 1] + rand() * 255;
}
巨大な switch ステートメントを使用して命令キャッシュをフラッシュしても、あまり効果はありません。ここに示すように、32,000 ケースを使用しました: 命令キャッシュ ミスを引き起こすにはどうすればよいですか?
FFT が操作するデータをメモリの別の部分にある複製構造にコピーしてからコピーを操作すると、L2 をフラッシュするのと同じ効果はありません。
何が起こっているのか理解したいです。Tegra 3 では、プロセスとスレッドのアフィニティをシングル コアに強制しました。他にどのような簡単にアクセスできる測定値を作成または表示できますか?