rpsv
@rpsv
делай либо хорошо, либо никак

Как указать число ядер и потоков при распараллеливании?

Здрасте! Задача довольна простая, но что-то я столкнулся с затруднениями. Суть в следующем: нужно произвести произведение матриц на нескольких ядрах, на нескольких потоках.

Про ядра:
Данная задача решается с помощью класса Parallel:
Код
List<Action> actions = new List<Action>();
int m = a.Rows;
int step = m / countCPU;
// производим разделение начальных данных (то есть дробим матрицу на подматрицы)
for (int i = 0; i < countCPU; i++)
{
    int indexMin = i * step;
    int indexMax = (i == (countCPU- 1)) ? (m - 1) : (step * (i + 1) - 1);
    // метод CalcMulty выполняет собственное произведение матриц
    actions.Add(delegate() { CalcMulty(a.getRangeRows(indexMin, indexMax), b); });
}
// выполняем операции и делаем замер времени
Stopwatch time = new Stopwatch();
time.Start();
Parallel.Invoke(new ParallelOptions() { MaxDegreeOfParallelism = countCPU}, actions.ToArray());
time.Stop();
return time.Elapsed;


Тут все в порядке, выполняются задачи на ядрах, но вот вопрос, как указать число ПОТОКОВ на которых нужно выполнять данную задачу (например: 1 ядро 1 поток, 1 ядро 2 потока, 2 ядра по 1 потоку на ядро, etc)

Желательно с небольшим примерном, спасибо!

P.S. возможно это можно сделать с помощью TaskScheduler?
  • Вопрос задан
  • 2660 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы