1

多くのベクトル ペアの内積を計算しようとしています。各ドット積は複数のスレッドを使用できますが、データの依存性のため、2 つ以上のドット積を同時に実行することはできません。ここで、マルチスレッドを正当化する最小ベクトル サイズはどれくらいですか? 誰も正確な答えを出すことができないことはわかっているので、大まかな見積もりを探しているだけです.

問題にもう少しコンテキストを追加するには: 私のプログラムは多くの内積を計算する必要がありますが、一度に実行できる内積は 1 つだけです。

double serial_dot_product(const double* x, const double* y, size_t length);

内積を書き直してマルチスレッド化したいと考えています。しかし、length小さすぎると、複数のスレッドを使用しても何も得られません。

編集。ご意見をお寄せいただきありがとうございます。答えは、コンパイラ、CPU、メモリ、スレッド化ライブラリなど、あまりにも多くの要因に依存しているようです。

4

2 に答える 2

3

実際に知る唯一の方法は、試してみることです (実行しているハードウェアによって結果が異なる場合があることに注意してください)。テストを自動化するプロファイリング ルーチンを作成し、(そうする価値があると判断した場合) プログラムの起動時にそのルーチンを短時間実行して、現在のハードウェアでの最適値を調べることもできます。

#include <sys/time.h>

unsigned long long GetCurrentTime() 
{
   struct timeval tv;
   gettimeofday(&tv, NULL);
   return (((unsigned long long)tv.tv_sec)*1000000) + ((unsigned long long)tv.tv_usec);}
}

void FindOptimumMethod()
{
   unsigned long long lowestTime = ((unsigned long long)-1);
   int bestVectorLength = 0;
   int bestNumThreads = 0;
   for (int vectorLen=1; vectorLen<100000; vectorLen++)
   {
      for (int numThreads=1; numThreads<16; numThreads++)
      {
         unsigned long long startTime = GetCurrentTime();
         DoTheCalculation(numThreads, vectorLen);
         unsigned long long elapsedTime = GetCurrentTime()-startTime;
         if (elapsedTime < lowestTime)
         {
            lowestTime = elapsedTime;
            bestVectorLength = vectorLen;
            bestNumThreads = numThreads;
         }
      }
   }
   printf("The fastest way is %i threads using a vector length of %i\n", bestNumThreads, bestVectorLength);
 }
于 2011-06-15T16:13:52.167 に答える
0

私の経験では、スレッドはかなり重いです。可変サイズの作業ブロックをスレッドに渡すことができるように記述します。その後、必要に応じて調整できます。

スレッドまたは GPU を使用できるライブラリの使用も検討します。GPU は内積を行うのに非常に優れているに違いありません。

于 2011-06-15T18:43:21.420 に答える