Стоимость разветвления потоков: как определить минимальный размер вектора, чтобы оправдать многопоточность - PullRequest
1 голос
/ 15 июня 2011

Я пытаюсь вычислить точечные произведения многих пар векторов.Каждый точечный продукт может использовать несколько потоков, но нельзя использовать два или более точечных продукта одновременно из-за зависимости данных.Какой минимальный размер вектора здесь может оправдать многопоточность?Я понимаю, что никто не сможет дать мне точный ответ, поэтому я просто ищу приблизительные оценки.

Чтобы добавить немного больше контекста к проблеме: моей программе нужно вычислить многоточечных продуктов, но только один точечный продукт может быть сделан за один раз.

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

Я хочу переписать точечный продукт, чтобы сделать его многопоточным.Но если length слишком мало, использование нескольких потоков ничего не даст.

РЕДАКТИРОВАТЬ.Спасибо всем за ваш вклад.Похоже, что ответ зависит от слишком многих факторов - компилятор, процессор, память, библиотека потоков и т. Д.

Ответы [ 2 ]

3 голосов
/ 15 июня 2011

Единственный реальный способ узнать это - попробовать (и помнить, что результаты могут отличаться в зависимости от того, на каком оборудовании вы работаете).Вы можете написать подпрограмму профилирования для автоматизации теста и (если вы считаете, что это того стоит) даже кратко запустить эту подпрограмму при запуске вашей программы, чтобы выяснить, какое оптимальное значение имеет текущее оборудование.

#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);
 }
0 голосов
/ 15 июня 2011

Мой опыт показывает, что темы довольно тяжелые.Напишите его, чтобы вы могли передавать потоки блоков переменного размера в потоки.Затем вы можете настроить при необходимости.

Я бы также подумал об использовании библиотеки, которая может использовать потоки или графический процессор.Могу поспорить, что GPU отлично справится с точечными продуктами.

...