Итак, из того, что я получаю, самое важное, на что следует обратить внимание, это то, что многопоточность очень мало связана с параллелизмом (например, UMA с многоядерными процессорами). Таким образом, хотя многопоточность может быть способом реализации параллелизма, это не способ обеспечить АКТУАЛЬНОЕ параллельное выполнение, что я искал в первую очередь, поскольку я изучаю параллельные и распределенные системы и алгоритмы.
Так, чтобы ответить на один вопрос за один раз. Да, pthreads и, вероятно, большинство (если не все) других API-интерфейсов потоков основаны на API-интерфейсе операционной системы. Какой ofc дает им те же ограничения, что и ОС. Это означает, что да, если ОС (конкретно в данном случае, некоторые окна, работающие, например, pthreads-win32) не поддерживают несколько ядер, всегда используется только одно ядро. Как указано на предоставленной вики-странице, ссылка на: «Гиперпоточность требует, чтобы операционная система не только поддерживала несколько процессоров, но и была специально оптимизирована для HTT, а Intel рекомендует отключать HTT при использовании операционных систем, которые имеют не был так оптимизирован ". http://en.wikipedia.org/wiki/Hyper-threading Это означает, что в большинстве случаев просто планировщик аппаратных средств (базовый) недостаточно для использования преимуществ нескольких ядер, он должен поддерживаться / использоваться SW (поддержка ОС).
Хотя это может и не быть окончательным доказательством, я считаю, что достаточно доказательств указывает в том же направлении, чтобы подтвердить, что это так.
Я не просеивал источники pthreads (для posix-совместимых ОС), полагаю, что то же самое относится и к этому API, так как более вероятно, что он будет использовать базовый API OS. Вам придется подтвердить это самостоятельно. :)
Кроме того, любые потенциальные библиотеки, которые могут поддерживать выполнение на нескольких ядрах, даже если ОС, на которой они работают, не поддерживают несколько ядер, вам придется найти их самостоятельно (если они существуют), пожалуйста, оставьте комментарий.
Чтобы обеспечить параллелизм (выполнение на разных ядрах) вручную, linux предоставляет способ закрепления потока за конкретным виртуальным процессором (при определенных условиях). Чтобы привязать весь процесс к определенному (виртуальному) процессору / ядру, можно использовать sched_setaffinity () (из sched.h). Как указывалось в nos, pthreads предоставляет pthread_setaffinity_np () для закрепления определенного потока на конкретном ядре. Windows поддерживает аналогичную функциональность с SetThreadAffinityMask (), поэтому очевидно, что назначение потоков вручную для параллельного запуска на разных ядрах возможно (если ОС поддерживает многоядерные системы).
Из моего опыта кодирования с помощью pthreads, если вы пишете для кода, который использует несколько потоков (более 2), они ДОЛЖНЫ выполняться на нескольких физических ядрах, если они доступны (что, вероятно, является функцией ОС, используемой pthreads).
Мои вопросы были довольно общими с самого начала, так как большинство этих вещей зависит от конкретной реализации, сложно дать один ответ. Я надеюсь, что этот ответ достаточно подробен, чтобы помочь вам уточнить некоторые вещи.
Приветствия, Val