переопределить цикл с помощью Parallel.For

как повторно реализовать цикл ниже, используя Parallel.For?

for (int i = 0; i < data.Length; ++i)
  {
      int cluster = clustering[i];
      for (int j = 0; j < data[i].Length; ++j)
          means[cluster][j] += data[i][j]; // accumulate sum
  }

цель - повышение производительности и ускорения.


person Araz    schedule 22.12.2014    source источник
comment
Мы не делаем здесь вашу работу напрямую. Вам нужно показать нам то, что вы уже пробовали.   -  person cost    schedule 23.12.2014
comment
выполните поиск в Google и узнайте, как использовать Parallel.ForEach   -  person MethodMan    schedule 23.12.2014
comment
Насколько велики ваши массивы? Вам действительно нужен параллелизм? (Дополнение - одна из самых дешевых инструкций)   -  person L.B    schedule 23.12.2014
comment
речь идет не о цикле Parallel.ForEach.   -  person Araz    schedule 23.12.2014
comment
Data.Length - около миллиона.   -  person Araz    schedule 23.12.2014


Ответы (1)


Вы можете просто заменить внешний цикл. Однако вам нужно позаботиться о настройке, поскольку вы устанавливаете значения из нескольких потоков:

Parallel.For(0, data.Length, i => 
{
  int cluster = clustering[i];
  for (int j = 0; j < data[i].Length; ++j)
      Interlocked.Add(ref means[cluster][j], data[i][j]); 
});

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

person Reed Copsey    schedule 22.12.2014
comment
Спасибо; Перегрузки метода Interlocked.Add не поддерживают двойной тип, так как мой массив именованных данных является двойным. Я прочитал соответствующий пост в этом случае, но мне не ясно, как точно переписать предложенный вами цикл. - person Araz; 23.12.2014
comment
Этот цикл является одним из узких мест в моем алгоритме, поскольку мне интересно управлять им, используя параллелизм для увеличения скорости. какое лучшее решение, учитывая ложное совместное использование и кеширование? - person Araz; 23.12.2014
comment
@Araz Без interlocked.add вам нужно будет выполнить другую форму синхронизации (возможно, с использованием блокировки). Возможно, стоит переосмыслить структуру алгоритма, чтобы разделить работу и упростить ее распараллеливание. - person Reed Copsey; 23.12.2014