Мой код с openmp с использованием «сокращения» не возвращает те же результаты от запуска до запуска.Сокращение в Openmp возвращает разные результаты с тем же числом потоков в моем коде
Случай 1: с помощью "сокращения"
sum = 0;
omp_set_num_threads(4);
#pragma omp parallel for reduction(+:sum)
for(ii = 0; ii < 100; i++)
sum = sum + func(ii);
с FUNC (II) имеет побочные эффекты. Фактически, func (ii) использует другую функцию calcul(), которая может привести к условию гонки при параллельном выполнении. Я думаю, что функция calcul() может быть причиной этой проблемы. Тем не менее, я использую «критический», результаты всегда одни и те же, но это решение не подходит для производительности. Второй
Корпус: с помощью "критического"
sum = 0;
#pragma omp parallel for
for(ii = 0; ii < 100; i++)
{
#pragma omp critical
sum = sum + func(ii);
}
с FUNC (II) функции
func(int val)
{
read_file(val);
calcul(); /*calculate something from reading_file(val)*/
return val_fin;
}
Пожалуйста, помогите мне решить это?
Большое спасибо!
Похоже, ваш вопрос не с 'reduction' части, но в состоянии гонки в рамках' FUNC (II) 'вызова. Поскольку мы не можем видеть код для 'func' или' calcul', трудно сказать что-то еще. –
Привет, Dan, мой func (ii) также усложняет, тогда я могу представить вам его копию func (ii) {... read (ii); ... calcul(); ... возвращаемое значение; } – hamalo
Вам не нужно публиковать всю функцию, достаточно, чтобы * воссоздать вашу проблему * и сделать ваш вопрос понятным. См. [Как создать минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve). –