1

一般に、GPU の場合、どちらのアクセス モードが高速ですか (グローバル メモリの連続ブロックからデータを読み取る)?

(1) グローバルメモリのブロックからデータを読み取る単一または非常に少数のスレッドによる for ループ。

(2) おそらく異なるブロックからの多くのスレッドが、グローバルメモリから同時にデータを読み取るようにします。

例えば

if (threadIdx.x==0)
{
  for (int i=0; i<1000; ++i)

     buffer[i]=data[i];//data is stored in global memory
}

OR:

buffer[threadIdx.x]=data[threadIdx.x];//there are 1000 threads in this thread block
4

2 に答える 2

1

要するに、2番目の方が一般的に高速です。理由は次のとおりです。

並列処理には、スレッドレベルの並列処理 ( TLP ) と命令レベルの並列処理 ( ILP )の 2 種類があります。最初のコード (ループ) は ILP を対象とし、2 番目のコードは TLP を利用します。

TLP を悪用すると、制御フローに依存することなく、多数のメモリ要求が同時に発行されます。この状況では、ハードウェアはスレッド間の局所性を利用して、合計メモリ トランザクションを削減できます (可能な場合)。さらに、ハードウェアは、L2 キャッシュ バンクの並列処理、メモリ コントローラーの並列処理、DRAM バンクの並列処理、およびその他の多くのレベルの並列処理を通じて、同時要求を同時に処理できます。

ただし、ILP の場合、既存の制御依存関係により、同時に発行されるメモリ要求の数が制限されます。これは、ループ展開の場合にも当てはまります (スコアボード サイズや命令ウィンドウ サイズなどのハードウェア リソースによって、未処理の命令の合計が制限されます)。そのため、メモリ要求の多くは実際には不必要にシリアル化されています。さらに、メモリ アクセスの合体におけるハードウェア機能は活用されません。

于 2013-03-16T08:41:33.560 に答える
-3

解決策の方が高速です。1000 スレッドは 1000 のタスクであり、実際には 1 つのタスク アドレス空間を共有します。OS のプロセス スケジューリングは、CPU の多くのリソースを消費する必要があります。したがって、CPU は常に中断されます。

1 つのタスクで実行すると、CPU は常に 1 つのタスクを処理します。マルチコア CPU の方が処理能力は高いのですが、1000 スレッドでは大きすぎます。

于 2013-03-16T08:44:42.527 に答える