Есть ли в моем коде накладные расходы, которые замедляют работу с потоками [C ]

#performance #c #multithreading

#Производительность #c #многопоточность

Вопрос:

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

Сценарий потока:

 #include <iostream>
#include <ctime>
#include <thread>

void determinant(int matrix[3][3]){
  int a = matrix[0][0]*((matrix[1][1]*matrix[2][2])-(matrix[1][2]*matrix[2][1]));
  int b = matrix[0][1]*((matrix[1][0]*matrix[2][2])-(matrix[1][2]*matrix[2][0]));
  int c = matrix[0][2]*((matrix[1][0]*matrix[2][1])-(matrix[1][1]*matrix[2][0]));
  int determinant = a-b c;
}

int main() {
  int matrix[3][3]= {
    {11453, 14515, 1399954}, 
    {13152, 11254, 11523}, 
    {11539994, 51821, 19515}
  };
  int matrix2[3][3] = {
    {16392, 16999942, 18682}, 
    {5669, 466999832, 1429}, 
    {96989, 10962, 63413}
  };
  const clock_t c_start = clock();
  std::thread mat_thread1(determinant, matrix);
  std::thread mat_thread2(determinant, matrix2);
  mat_thread1.join();
  mat_thread2.join();
  const clock_t c_end = clock();
  std::cout << "nOperation takes: " << 1000.0 * (c_end-c_start) / CLOCKS_PER_SEC << "ms of CPU time";
}
  

Скрипт без другого потока, кроме основного:

 #include <iostream>
#include <ctime>
#include <thread>

void determinant(int matrix[3][3]){
  int a = matrix[0][0]*((matrix[1][1]*matrix[2][2])-(matrix[1][2]*matrix[2][1]));
  int b = matrix[0][1]*((matrix[1][0]*matrix[2][2])-(matrix[1][2]*matrix[2][0]));
  int c = matrix[0][2]*((matrix[1][0]*matrix[2][1])-(matrix[1][1]*matrix[2][0]));
  int determinant = a-b c;
}

int main() {
  int matrix[3][3]= {
    {11453, 14515, 1399954}, 
    {13152, 11254, 11523}, 
    {11539994, 51821, 19515}
  };
  int matrix2[3][3] = {
    {16392, 16999942, 18682}, 
    {5669, 466999832, 1429}, 
    {96989, 10962, 63413}
  };
  const clock_t c_start = clock();
  determinant(matrix);
  determinant(matrix2);
  const clock_t c_end = clock();
  std::cout << "nOperation takes: " << 1000.0 * (c_end-c_start) / CLOCKS_PER_SEC << "ms of CPU time";
}
  

PS — 1-й скрипт занял 0,293 мс при последнем запуске, а второй скрипт занял 0,002 мс

Еще раз спасибо,

wndlbh

Комментарии:

1. Похоже, это вопрос о программировании. Не вопрос о Unix.

2. Я не был уверен, что проблема заключается в коде или в реальном оборудовании (т. Е. В Использовании набора задач для принудительной загрузки скрипта на определенный процессор, заставляя код работать должным образом).

Ответ №1:

Разница, по-видимому, заключается в создании двух потоков и объединениях. Я ожидаю, что время на это (создание и объединение) намного больше, чем время на выполнение 9 умножений и 5 сложений.

Комментарии:

1. Спасибо. Разве потоки не должны выполняться одновременно?

2. Разве потоки не должны выполняться одновременно? Да, но для создания потоков требуется больше времени, чем для выполнения работы, поэтому однопоточный код будет быстрее. Вам придется протестировать свой код с гораздо большей матрицей, чтобы увидеть выигрыш многопоточного кода.

3. Спасибо за это, мне придется попробовать это и увидеть разницу в действии

Ответ №2:

Затраты на запуск (и демонтаж) нового потока огромны, и в этом случае заглушается реальная работа. Кажется, я помню время между 1 мс и 1 с в зависимости от ваших настроек. Больше потоков в первую очередь помогает, если время, сэкономленное на работе, превышает стоимость создания потоков. В этом случае вам потребуется 1000 вычислений, чтобы сэкономить так много.