Можно ли несколько раз вызывать простую функцию с использованием многопоточности?C ++ 11 - PullRequest
0 голосов
/ 13 октября 2018

Я хотел бы вызывать функцию небольшое количество раз (т.е. 4 раза), используя многопоточность.Используя пример из блога Solarian Programmer (https://solarianprogrammer.com/2011/12/16/cpp-11-thread-tutorial/),) я написал эту простую программу на c ++ 11:

     #include <iostream>
     #include <thread>
     #include <ctime>
     #include <math.h>

     #define PI 3.14159265358979323846

     static const int num_threads = 4;

     void call_from_thread(int tid) {
         std::cout << log(2) - 0.5*log(2*PI) - log(1.05) - pow(2.3-0.5,2)/(2*pow(1.05,2))<<std::endl;
     }

     int main() {
     std::thread t[num_threads];

     std::clock_t start;
    start = std::clock();

     //Launch a group of threads
     for (int i = 0; i < num_threads; ++i) {
         t[i] = std::thread(call_from_thread, i);
     }

     std::cout << "Launched from the main\n";

     for (int i = 0; i < num_threads; ++i) {
         t[i].join();
     }
     std::cout << "Time: " << (std::clock() - start) / (double)(CLOCKS_PER_SEC / 1000) << " ms" << std::endl;

     return 0;
 }

Конечно, этот пример тривиален, иМне здесь не нужна многопоточность, так как функция всегда возвращает один и тот же результат. Но я планирую немного изменить эту функцию, чтобы иметь некоторые различия между потоками. При запуске этого кода я получил что-то вроде:

Time: 0.806 ms

Теперь, если я изменю приведенный выше код, чтобы разрешить только однопоточный код, у меня будет следующее:

     int main() {
     std::thread t[num_threads];

     std::clock_t start;
    start = std::clock();

     //Launch a group of threads
     for (int i = 0; i < num_threads; ++i) {
         call_from_thread(i);
     }

     std::cout << "Launched from the main\n";

     std::cout << "Time: " << (std::clock() - start) / (double)(CLOCKS_PER_SEC / 1000) << " ms" << std::endl;

     return 0;
 }

Здесь время выполнения намного меньше:

Time: 0.116 ms

Итак, мой вопрос: могу ли я вызывать эту простую функцию несколько раз, используя многопоточность, чтобы ускорить мой код? В основном, я хотел бы перейти ниже этих 0,116 мс.

Примечание такжеЯ новичок в C ++ и параллелизме, поэтому извините, если мой вопрос не кажется актуальным.

Ответы [ 2 ]

0 голосов
/ 13 октября 2018

Я перешел по ссылке, которую вы предоставили, и прочитал ее на их веб-странице:

Теперь, чтобы увидеть работающий параллельный код, нам нужно будет дать ему значительный объем работы.в противном случае затраты на создание и уничтожение потоков сведут на нет наши усилия по распараллеливанию этого кода.Входное изображение должно быть достаточно большим, чтобы реально увидеть улучшение производительности при параллельном выполнении кода.Для этой цели я использовал изображение размером 16000x10626 пикселей, занимающее около 512 МБ в формате PPM:

На этой странице даже говорится то же самое, что и у пользователя: Basile Starynkevitch уже дано.Я согласен с этим утверждением при использовании нескольких потоков.

0 голосов
/ 13 октября 2018

Вы можете (теоретически) сделать это, но помните, что создание нового потока - сложная и тяжелая операция (для операционной системы и стандартной библиотеки C ++).В Linux std::thread будет использовать pthread_create (3) , который использует clone (2) (системный вызов низкого уровня ).

На практике (как очень наивное практическое правило) создание потока может занять несколько миллисекунд и имеет смысл только в том случае, если этот поток работает дольше нескольких миллисекунд.Так что вы можете захотеть иметь пул потоков с.Помните, что элементарная операция (инструкция машинного кода, например, добавление 32 бит) обычно занимает всего несколько наносекунд (миллион из них составляет миллисекунду).Так что в реальной жизни использование потоков полезно только для довольно «сложных» функций.

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

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