大量のデータを処理するアプリケーションがあります。
ワーキング セットが L2(L3) キャッシュを超えると、パフォーマンスが劇的に低下します。
データのプリフェッチを使用してその一部を修正したいと考えています。
ハイパースレッド CPU で実行されるマルチスレッド コードがコアとキャッシュを共有するという事実を利用したいと考えています。
最初のスレッド (A) はワーカー スレッドです。
2 番目のスレッド (B) は、データをプリフェッチします。
両方のスレッドを同じコアで強制的に実行できる場合は、スレッド (B) を先に実行してデータを取得できます。
これが疑似コードでどのように見えるかです。
procedure TWorkerThread.Execute;
begin
Node:= WalkTheDataTree.GetNode;
Dowork(Node.MyData);
SyncWithThreadB;
end;
procedure TFetchThread.Execute;
begin
WaitForThreadA;
Node:= WalkTheDataTree_5_nodes_Ahead_of_A.GetNode; //Prefetch data.
end;
両方のスレッドはロックステップで実行され、ワーカー スレッドはフル スピードで実行され、フェッチ スレッドはシグナルを待機します。
HyperThreaded CPU の同じコアで 2 つのスレッドを強制的に実行する方法はありますか?
Delphi XE2 を使用しています。
PS CPUID命令を使用して、CPUがハイパースレッディングをサポートしているかどうかを検出する方法を知っています。