Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.06.2013, 16:26   #1
BrookBond
Пользователь
 
Аватар для BrookBond
 
Регистрация: 08.06.2012
Сообщений: 46
По умолчанию Циклы For и OpenMP

Приветствую знатоков!

Только начал изучать OpenMP и сразу попытался применить его на практике.
Пишу прогу, которая в дальнейшем будет работать (сравнивать матрицы больших размеров) на многоядерном компе.
Вот проблемная часть этой проги, где используется OpenMP и возникают непонятные мне действия.
Код:
#pragma omp parallel for
for(p=0;p<=6300;p++) {

Sp1x=(Sp1.X*Sp1.s+Sp1.R*pow(fi,a/(2*pi))*cos(Sp1.c*a+Sp1.faz))/Sp1.s;//-3*cos(a-faz);
Sp1y=Sp1.y0+Sp1.R*pow(fi,a/(2*pi))*sin(Sp1.c*a+Sp1.faz);//-3*sin(a-faz);
if(a>=0 && a<=2*pi){i1=1;}
if(a>2*pi && a<=4*pi){i1=2;}
if(a>4*pi && a<=6*pi){i1=3;}
if(a>6*pi && a<=8*pi){i1=4;}

    if(Sp1x>XX1+2)  {
     b=0;

     do {
     Sp2x=(Sp2.X*Sp2.s+Sp2.R*pow(fi,b/(2*pi))*cos(Sp2.c*b+Sp2.faz))/Sp2.s;//-3*cos(a-faz);
     Sp2y=Sp2.y0+Sp2.R*pow(fi,b/(2*pi))*sin(Sp2.c*b+Sp2.faz);//-3*sin(a-faz);
     if(b>=0 && b<=2*pi){i2=1;}
     if(b>2*pi && b<=4*pi){i2=2;}
     if(b>4*pi && b<=6*pi){i2=3;}
     if(b>6*pi && b<=8*pi){i2=4;}

         if(Sp2x>XX2+1)  {
     if(Sp1x-0.1<=Sp2x && Sp1x+0.1>=Sp2x && Sp1y-2.5<=Sp2y && Sp1y+2.5>=Sp2y )
                        { //fprintf(f5,"%1.2f \t %1.2f \t%d \t%d\n",Obmen1.x,Obmen1.y,Obmen1.n,Obmen2.n);
                          Obmen3[j].x=Sp1x; Obmen3[j].y=Sp1y; Obmen3[j].n=i1; Obmen3[j].X0=Sp1.X; Obmen3[j].X1=Sp1.X1;
                          Obmen3[j+1].x=Sp2x; Obmen3[j+1].y=Sp2y; Obmen3[j+1].n=i2; Obmen3[j+1].X0=Sp1.X; Obmen3[j+1].X1=Sp1.X1;
        printf("%1.2f \t%1.2f \t%d \t%d \t%d \t%d \n",Obmen3[j].x,Obmen3[j].y,Obmen3[j].n,Obmen3[j].X0,Obmen3[j].X1,p);
// в самом правом столбце выводятся значения внешнего цикла по p                                  
 j=j+2;
                           break;}
                          }
     b+=0.004;
           } while (b<=25.2);
           } //if(Sp1x>Sp1.X1)

a=0.004*p;
}
Проблема в том, что если внешний цикл по р запараллелить, то данные начинают смешиваться, выводятся хаотично так как показано на прикрепленном рисунке (самый правый столбец это значения внешнего цикла по р). А нужно чтобы они выводились последовательно, с начала то что считает первое ядро (0...3150), а затем второе (3151..6300), но чтоб считались параллельно. Подскажите пожалуйста, что добавить/убрать ?
Прикреплен проект в Qt Creator, работаю на вин 7.
Изображения
Тип файла: jpg Результат работы проги.jpg (37.2 Кб, 125 просмотров)
Вложения
Тип файла: rar Program.rar (321.5 Кб, 7 просмотров)
BrookBond вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
OpenMP и while на С++ Brabus Помощь студентам 3 13.03.2013 14:47
openmp hunter03 Общие вопросы C/C++ 0 02.10.2012 17:54
OpenMP Timur1 Visual C++ 1 16.06.2012 15:40
Глобальные переменные и OpenMP AndrewMT Общие вопросы C/C++ 0 31.05.2012 14:54
OpenMP Алек Помощь студентам 2 14.10.2011 11:52