concurrency :: parallel_for повторяется непоследовательно каждый раз

Я использую параллель для в одном из моих приложений, который содержит цикл, как показано ниже. Насколько я понимаю, цикл parallel_for будет перебирать весь диапазон, но не обязательно в последовательном порядке, но он будет перебирать все Весь ассортимент тем не менее, я получаю противоречивые результаты для простого подсчета.

using namespace concurrency;
using namespace std;

#include <ppl.h>
#include <Windows.h>
#include <array>
#include <stdio.h>
int main()
{
combinable<DWORD64> count[10];
int b, c;
for (c = 0; c < 10; c++)
{
parallel_for(0, 52, [&](int a)
{
//printf("%d,", a);
for (b = a + 1; b < 52; b++)
{
count[c].local()++;
}
});
printf("\n%llu\n", count[c].combine(plus<DWORD64>()));
}
getchar();
}

принимая во внимание a повторяется от 0 до 51 и b повторяется от a + 1 до 51 значение count [c] должно быть 1326 [(n * n + 1) / 2, где n = 51] каждый раз? но это не так. Фактически, каждый раз, когда я получаю случайный счет … но если я откомментирую первый оператор printf printf("%d,", a); волшебным образом вывод исправлен?
Как я могу исправить это? Я подозреваю, что у этого есть некоторая проблема синхронизации, которую я не решаю, и оператор printf каким-то образом решает, вводя произвольное время ожидания.

Как правильно обрабатывать / использовать циклы parallel_for?

РЕШИТЬ
вторая переменная итерационного цикла b было определено в main, где, как и должно было быть определено локально в каждом потоке, объявление переменной во втором цикле решает проблему, но это не объясняет, почему добавление printf в цикл a исправил проблему несмотря на это b неправильно определен и испытывает состояние гонки

Исправленный код ниже

использование параллелизма пространства имен;
использование пространства имен std;

#include <ppl.h>
#include <Windows.h>
#include <array>
#include <stdio.h>
int main()
{
combinable<DWORD64> count[10];
int c;
for (c = 0; c < 10; c++)
{
parallel_for(0, 52, [&](int a)
{
//printf("%d,", a);
for (int b = a + 1; b < 52; b++)
{
count[c].local()++;
}
});
printf("\n%llu\n", count[c].combine(plus<DWORD64>()));
}
getchar();
}

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]