30% на версию ядра - просто плохой планировщик (звучит как Windows 7), очень часто переносящий процесс с ядра на ядро. Вероятно, это ближе к 25% на ядро (1/4) для вашего процесса плюс дополнительная нагрузка, составляющая 30%. Если вы запустите тот же пример под Linux, вы, вероятно, увидите одно ядро в привязке.
Когда вы преобразовали в (1 to 30).par
, вы действительно начали использовать потоки на всех ядрах, но накладные расходы на синхронизацию распределения такого небольшого объема работы и последующего сбора результатов сводили на нет преимущества параллелизма. Вы должны разбить свою работу на более крупные независимые куски.
РЕДАКТИРОВАТЬ: если каждый из 1..30 представляет некоторый больший объем работы (скажем, решение лабиринта), то автоматическое распараллеливание будет работать намного лучше, если каждая единица работы примерно одинакова. Представьте, что у вас было 29 легких лабиринтов и один очень очень твердый лабиринт. 30-й лабиринт все еще будет работать последовательно (или почти) со всем остальным). Если ваши лабиринты усложняются по количеству, попробуйте создать их в порядке 30 to 1 by -1
, чтобы самые большие задачи выполнялись первыми. Думайте об этом как о мозговом решении проблемы ранца.