2010-12-02 5 views
0

im использование задач параллельная библиотека в .net 4.0 Я хочу иметь возможность задавать задачу для каждого ядра независимо от других ядер. обычно в TPL, я создаю задачу, и я говорю ей, чтобы она работала параллельно, я не контролирую количество созданных потоков и не могу контролировать количество ядер для участия в параллельной задаче. Кроме того, я не могу указать каждому конкретному ядру другую задачу. Я хотел бы знать, как добиться этого в TPL, если это возможно.параллельное программирование в TPL

+5

Так что вы хотите ... использовать TPL в основном эмулировать с помощью обычных потоков? – 2010-12-02 21:11:10

ответ

1

Как указывали другие, вы, вероятно, не хотите этого делать.

Существует библиотека ParallelExtensionsExtras на CodePlex, который имеет various task schedulers, один из которых является «нить на задачу» планировщика, а другой (LimitedConcurrencyLevelTaskScheduler), что позволяет определить степень параллелизма.

Однако они не обеспечивают сродство нитей к определенному ядру. Вы должны были бы закодировать это самостоятельно.

1

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

Ближайшая вещь, о которой я знаю, это ParallelEnumerable.WithDegreesOfParallelism, которая устанавливает максимальное количество одновременно выполняемых задач, которые будут использоваться для обработки запроса.

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

+0

так что если использовать threading am, я могу указать темы для ядер? – 2010-12-02 21:17:46

1

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

По замыслу, цель TPL является то, что вы не должны сделки с этими вопросами. Настройка может быть очень сложной, TPL выполняет довольно хорошую работу.

0

Я только заметил, что существует способ контролировать степень параллелизма в TPL. Пример кода приведен ниже, который использует ParallelOptions для определения максимального параллелизма при параллельном выполнении цикла.

Это взято из статьи Ричарда Карра по адресу: Control Degree of Parallelism in TPL

ParallelOptions po = new ParallelOptions(); 
po.MaxDegreeOfParallelism = 2; 

Parallel.For(0, 20, po, i => 
{ 
    Console.WriteLine("{0} on Task {1}", i, Task.CurrentId); 
}); 
Смежные вопросы