Я столкнулся с одной проблемой в C ++.
Предположим, у нас есть vector<SomeClass> v
, и мы хотим добавить все элементы v
, используя многопоточность. (размер v
равен N
.)
У нас есть перегрузка +=
оператора в SomeClass
, но он не является атомно-совместимым.
SomeClass sum; // init by "zero" but not exactly a single (int)
#pragma omp parallel for
for (int i=0; i<N; ++i) {
#pragma omp critical
{
sum += v[i];
}
}
Мой эксперимент показывает, что время выполнения этого кода аналогично времени выполнения с одним потоком.
Я думаю, что это связано с разделом critcial
, где только одному потоку разрешено оценивать сложение одновременно. (Я не могу воспользоваться многопоточностью).
Альтернативой может быть использование atomic
или (reduction
), но они недоступны, поскольку +=
не для атомарных переменных.
В таком случае, что мы можем сделать?
Должен ли я выйти, чтобы использовать многопоточность здесь?
Большое спасибо.