2014-12-22 2 views
0

как выполнить цикл ниже, используя 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 
    } 

Повышение эффективности и ускорение - цель.

+0

Мы не работаем для вас здесь. Вам нужно показать нам, что вы уже пробовали. – cost

+0

выполните поиск в Google и узнайте, как использовать Parallel.ForEach – MethodMan

+0

Насколько велики ваши массивы? Вам действительно нужен параллелизм? (* Дополнение * - одна из самых дешевых инструкций) –

ответ

3

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

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]); 
}); 

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

+0

спасибо; Interlocked.Add Перегрузки метода не поддерживают двойной тип, так как мой массив с именем «data» равен double. В этом случае я прочитал связанную запись, но мне не ясно, как точно переписать предложенный цикл. – Araz

+0

Этот цикл является одним из моих узких мест в моем алгоритме, поскольку мне интересно управлять им, используя параллелизм для ускорения. что такое лучшее решение, учитывающее ложное совместное использование и кеширование? – Araz

+0

@Araz Без interlocked.add вам нужно будет выполнить некоторую другую синхронизацию (возможно, используя блокировку). Возможно, стоит пересмотреть дизайн алгоритма, чтобы отделить работу, чтобы ее можно было распараллелить. –

Смежные вопросы