параллельное программирование в TPL - PullRequest
0 голосов
/ 03 декабря 2010

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

Ответы [ 4 ]

1 голос
/ 03 декабря 2010

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

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

1 голос
/ 03 декабря 2010

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

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

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

1 голос
/ 03 декабря 2010

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

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

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

0 голосов
/ 02 августа 2014

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

Это взято из статьи Ричарда Карра по адресу: Контрольная степень параллелизма в TPL

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

Parallel.For(0, 20, po, i =>
{
    Console.WriteLine("{0} on Task {1}", i, Task.CurrentId);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...