По умолчанию потоки выполняются в нескольких ядрах?

В многоядерных процессорах и приложениях Windows запускается много потоков. по умолчанию потоки выполняются на нескольких ядрах? Я имею в виду, что каждый поток может работать на отдельном ядре.

Edit:

Если мое приложение запускает много потоков, все эти потоки будут выполняться в одном процессе.

Без параллельного программирования.

Является ли процесс способным делить и работать на многих ядрах?

Получает ли мое приложение преимущества многоядерной обработки?


Ответ 1

(Ваш вопрос довольно неясен. Надеюсь, я ответил на то, что вы просили, но если вы можете уточнить вопрос, который поможет.)

Это до ОС, где запланирован поток. Есть преимущества для поддержания потока на одном и том же ядре, если это возможно, с точки зрения когерентности кэша и т.д. — но заставляя его оставаться на одном ядре, как правило, чрезмерно ограничивает.

Короче: да, поток может работать на разных ядрах. Не в то же время, конечно же - это только один поток исполнения — но он может выполняться на ядре C 0 в момент времени T 0, а затем на ядре C 1 в момент времени T 1.

EDIT: вы говорите о приложении, использующем много потоков, но "без параллельного программирования" — что противоречие в терминах. Если вы используете много потоков, вы используете параллельное программирование, и по умолчанию эти потоки могут работать на нескольких ядрах. Если вы используете только один поток, то вы не получите никакой выгоды от наличия нескольких ядер -— кроме того, что другие процессы могут использовать другие ядра, конечно.

Ответ 2

При запуске нескольких потоков они могут или не могут работать на разных ядрах.

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

Это зависит от операционной системы для планирования потоков.

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

  • Разделите свою работу на более мелкие кусочки, это позволит избежать действительно длинных потоков, которые вызывают один процессор.
  • Старайтесь избегать конфликтов данных, старайтесь убедиться, что каждый поток/задача получает все данные, которые ему нужны, и возвращает все данные, которые он создает на другом конце, вместо того, чтобы идти и разговаривать с структурой данных, Это позволяет избежать проблем с блокировкой или условий гонки.
  • Используйте время выполнения, чтобы помочь вам, не пытайтесь изобрести колесо. Если вы находитесь в .NET 4.0, вы должны посмотреть на TPL, параллельную библиотеку задач, которая поможет вам значительно.
  • Наконец, многопоточность сложна, не перепрыгивайте в это мышление, вы можете взломать его и учиться, когда идете. Прочитайте эту тему, пример кода примера, узнайте о подводных камнях и о том, как их избежать.

Ответ 4

люди, похоже, забывают, что одно ядро ​​содержит несколько ALU и что, хотя люди генерируют линейный программный код, на самом деле несколько инструкций могут выполняться одновременно и что даже не рассматривая конвейер. В принципе, производители процессоров должны выяснить способ сделать 1 псевдо ядра из нескольких ядер не только наоборот.