pir0texnik2
Junior Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Помогите плиз с распараллеливание.... Считаю ряд с хитрым интегралом внутри: Код: Nker = OMP_GET_NUM_PROCS( ) call OMP_SET_NUM_THREADS(Nker) !кол-во итераций вкидываемых в одну нить iter = 2 M_up=0 Y_old = 993123999.0; err = 99999.0 do while ((err > errrel).AND.(M_up<=M_max)) !считать пока не достигнем точности или не превысим лимит итераций M_up = M_up + iter*Nker !$OMP PARALLEL default(shared) PRIVATE(m) REDUCTION(+:Y_summ,precis) IF (Nker .GT. 1) !$OMP DO SCHEDULE (DYNAMIC , iter) do m=M_up-iter*Nker,M_up,1 CALL DQDAG (fY,0.0d0,1.0d0,errabs,errrel,1,Y,errest) Y_summ = Y_summ + Y enddo !$OMP END PARALLEL err=dabs(Y_summ-Y_old)/dabs(Y_summ) Y_old=Y_summ enddo | Когда компипирую такой код в консольной программку, то все нормально выполняется, ряд считается ПО ПОРЯДКУ и правильно, но когда компилирую тот же код, но в dll, то итерации в цикле начинают идти не п опорядку и сумма считается не правильно, хотя вроде опции компилятора стоят одинаковые(ну с разницей то exe, а другое dll ). При чем по идее сумма ряда тут не должна зависеть от порядка суммирования.... Ф-ция fY(x) зависит только от от номера итерации m... Как бы это все исправить.. Спасибо!! | Всего записей: 173 | Зарегистр. 27-02-2008 | Отправлено: 02:37 14-06-2009 | Исправлено: pir0texnik2, 02:45 14-06-2009 |
|