Другой вариант, не упомянутый здесь, за исключением многопоточности, - это использование OpenMP, доступного через библиотеки -fopenmp
и libgomp
, которые я установил в своей системе FreeBSD 8.
Они дают вам #pragma
директивы для распараллеливания определенных циклов, а операторы и т. Д., То есть биты, которые вы можете распараллеливать. Он заботится о многопоточности и ассоциации процессоров для вас. Обратите внимание, что это общее решение и, следовательно, может не быть оптимальным способом распараллеливания, но оно позволит вам распараллелить определенные подпрограммы.
Взгляните на это: https://computing.llnl.gov/tutorials/openMP/
Что касается использования самих потоков / процессов, то к нему подходят определенные процедуры и способы работы. Можете ли вы разбить задачи таким образом? Имеет ли смысл использовать fork () вашего процесса или создать поток? Если это так, сделайте это, но если нет, не пытайтесь заставить ваше приложение быть многопоточным только потому, что. Пример, который я обычно привожу, - это наибольший алгоритм общего делителя - он опирается на шаг раньше, чем все время в традиционной реализации, поэтому его трудно сделать параллельным.
Также отметим, что хорошо известно, что для некоторых алгоритмов распараллеливание на самом деле медленнее для небольших значений того, что вы делаете параллельно, потому что, хотя задания завершаются быстрее, связанные с этим затраты времени на разветвление и соединение (будь то потоки или процессы) фактически увеличивает время по сравнению с последовательной реализацией.