Как выполнить измерения F #, чтобы получить ускорения - PullRequest
5 голосов
/ 13 марта 2012

Предполагается одна машина с 8 ядрами.В Haskell вы можете скомпилировать, используя опцию threaded, затем во время выполнения используйте +RTS -Nx, чтобы указать количество ядер, которые будут использоваться.Например,

$ myprg args // sequential run
$ myprg args +RTS -N1 // parallel run on 1..8 cores
$ myprg args +RTS -N2
$ myprg args +RTS -N4
$ myprg args +RTS -N8

. Отсюда вы получаете время выполнения, используя увеличивающееся количество ядер, которое затем можете использовать для ускорения и построения графика.

Как бы вы сделали это в F #,при условии, что у меня есть параллельная программа, например, использующая параллельную карту в коде?

РЕДАКТИРОВАТЬ: Я обнаружил, что есть ParallelOptions например, MaxDegreeOfParallelism, которые могут будет то, что мне нужно, но не уверен в его точном поведении, и мне придется использовать его программно, что нормально, если он ведет себя, как ожидается, т.е. MaxDegreeOfParallelism = число ядер, которые должна использовать программа, а не параллельные «задачи»или потоки.

РЕДАКТИРОВАТЬ: ProcessorAffinity действительно ограничивает количество используемых ядер, но кажется, что он не реализован должным образом в Mono.Я проверил на Windows, и, кажется, работает.Хотя это не очень хорошая идея для использования.Система времени выполнения должна быть способна лучше решать, как управлять и планировать задачи.Кроме того, MaxDegreeOfParallelism относится к «уровню параллелизма», который в основном устанавливает количество сгенерированных задач, поэтому может использоваться для изменения степени детализации.

Ответы [ 2 ]

2 голосов
/ 15 марта 2012

F # создает собственную сборку .NET. Сборка следует правилам, установленным для среды выполнения (CLR), которая по умолчанию имеет сходство на всех ядрах процессора. Вы можете ограничить CLR для меньшего числа ядер, установив System.Diagnostics.Process.GetCurrentProcess().ProcessorAffinity.

Этот ответ кажется неполным для среды Mono. ProcessorAffinity значение - это битовая маска , поэтому 0, безусловно, является недопустимым условием. Мне также интересно, почему установщик не выдал исключение, как описано в MSDN.

Я бы использовал schedutils, чтобы проверить сродство Mono, а также проверить, не установлен ли MONO_NO_SMP флаг среды.

2 голосов
/ 13 марта 2012

Цитировать комментарий bytebuster:

F # создает собственную сборку .NET. Сборка следует правилам, установленным для среды выполнения (CLR), которая по умолчанию имеет сходство на всех ядрах процессора. Вы можете ограничить CLR для меньшего количества ядер, установив System.Diagnostics.Process.GetCurrentProcess().ProcessorAffinity.

(Если вы добавите ответ, оставьте комментарий, и я его удалю)

...