Каков быстрый или правильный способ разбора массива в Parallel.For

У меня есть большой одномерный массив, полный данных Zmap (данные о высоте), массив довольно огромен, он состоит из 100 выборок измерений пикселя площади. Мне нужно обработать его несколькими способами, чтобы можно было исправить еще один заблокированный битмап. Чтобы ускорить обработку этого большого массива, я использую parallel.for

ea:

public void MarkErrorSamples(int[]Depthdata,int lowbound)
{ 
    Parallel.For (0, depthData.Length, sampleN => 
    {
        if(depthData[sampleN] < lowbount) 
        {
            // update redchannel Red value by 20
            int x= xfromLockedmemPos(sampleN); // x value based upon sampleN
            int y =yfromLockedmemPos(sampleN); 
            setpixel(x,y,AddRed((getpixelRed(x,y),20);
        }
    });
}

Приведенный выше код работает, но у меня есть некоторые сомнения по поводу доступа к depthdata[sampleN] так, как я это делаю сейчас. Меня беспокоит то, что я думаю, что потоки могут блокировать массив каждый раз, когда поток запускается для извлечения из него данных. Поэтому мне интересно, как правильно работать с данными массива «внешний блок» в Parallel.for

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


person user613326    schedule 06.11.2015    source источник
comment
Меня беспокоит то, что я думаю, что потоки могут блокировать массив каждый раз, когда поток запускается для извлечения из него данных Не уверен, правильно ли я понял ваше предложение, но если массив заблокирован, например, тогда это уже не будет параллельно.   -  person M.kazem Akhgary    schedule 06.11.2015
comment
По общему мнению, доступ к различным частям массива из разных потоков не является проблемой. Источник 1, Источник 2< /а>.   -  person Heinzi    schedule 06.11.2015
comment
@ M.kazem Да, мне интересно, ничто другое не требует массив при вызове этой функции. но по-прежнему элементы массива находятся вне области действия Parallel.Fro. Поэтому мне интересно, можно ли в каждом потоке указать значение depthData[sampleN]   -  person user613326    schedule 06.11.2015
comment
Остерегайтесь false sharing, которые могут серьезно повлиять на параллельный алгоритм, например, из-за принудительной перезагрузки кэша процессора. .   -  person Matthew Watson    schedule 06.11.2015
comment
Эм, ну да, я беспокоюсь о блокировке доступа, по словам @Heinz, это не проблема, в то время как другие пишут об этом. Я мог бы даже «разделить» весь набор данных на более мелкие части и позволить простым действиям выполняться на меньших массивах... но все же я продолжаю задаваться вопросом: блокировки памяти, массивы и потоки. И я не знаю, как разобрать массив на Parallel, чтобы каждый поток знал, какой элемент массива использовать с нуля.   -  person user613326    schedule 06.11.2015