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 回答