Почему производительность моей программы увеличивается после того, как количество потоков превышает количество ядер? - PullRequest
0 голосов
/ 10 июля 2020

В рамках официального документа, который я делаю для класса, я решил создать простую программу, которая имитирует распределение 20-секундной распараллеливаемой задачи по заданному количеству потоков:

#include <iostream>
#include <ctime> // for the ctime function.
using namespace std;

int main()
{
   cout << "How many threads?";
   int threadCount;
   cin >> threadCount;
   time_t baseTime;
   time(&baseTime);
   #pragma omp parallel for num_threads(threadCount)
   for (int i=0; i<10; i++)
   {
      int timeElapsed = 0;
      time_t currentTime;
      time(&currentTime);
      while (timeElapsed < 2)
      {
         time_t newTime;
         time(&newTime);
         timeElapsed = newTime - currentTime;
      }
   }
   time_t currentTime;
   time(&currentTime);
   cout << currentTime - baseTime;
}

Машина, на которой я работаю, - это машина Linux, которая использует 4 ядра, с одним потоком на ядро, поэтому указанное время должно быть максимум на 4 ядрах. Но это не так:

график

Нечто подобное происходит, когда я использую pthreads. Почему это происходит?

1 Ответ

4 голосов
/ 10 июля 2020

Каждая ваша «задача» - тратить время примерно на 2 секунды, независимо от объема работы.

В современной ОС (включая Linux) ОС переключается между потоками за короткий промежуток времени. время, поэтому одно ядро ​​ЦП может выполнять несколько потоков одновременно.

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

Тогда обработка будет такой:

1 поток

1: ABCDEFGHIJ

2 потока

1: ABCDE
2: FGHIJ

3 потока

1: ABCD
2: EFG
3: HIJ

4 потока

1: ABC
2: DEF
3: GH
4: IJ

5 потоков

1: AB
2: CD
3: EF
4: GH
5: IJ

6 потоков

1: AB
2: CD
3: EF
4: GH
5: I
6: J

...

9 потоков

1: AB
2: C
3: D
4: E
5: F
6: G
7: H
8: I
9: J

10 потоков

 1: A
 2: B
 3: C
 4: D
 5: E
 6: F
 7: G
 8: H
 9: I
10: J

Как видите при использовании от 1 до 5 потоков минимальное количество задач, которые должны обрабатываться одним потоком, уменьшается с увеличением количества потоков.

Минимальное значение не изменяется при использовании 5–9 потоков и снова уменьшается при Используется 10 потоков.

Это объясняет ваш график.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...