2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2
 
 Re: не работает распараллеливание в gcc
Сообщение10.05.2024, 18:30 
Заслуженный участник


04/05/09
4589
Missir в сообщении #1638647 писал(а):
venco в сообщении #1638645 писал(а):
А почему переменная dv одна на всех?


я пробовал заводить для неё массив res[i] но это ни на что не влияет, видимо компилятор с этим справляется сам

Зачем массив? Обьявите её локально в цикле.

 Профиль  
                  
 
 Re: не работает распараллеливание в gcc
Сообщение10.05.2024, 20:02 


15/12/22
198
Вот так работает, результаты выдаёт правильные, задействует оба потока. Просто нужно было объявить переменные внутри.
Используется синтаксис C
#pragma omp parallel num_threads(2)
{
  #pragma omp for
  for (int i=0; i<sampl-1; i++)
  { printf ("iteration %d, thread=%d\n", i, omp_get_thread_num());
    x[i*sampl+i]=0.0;
    for (int j=i+1; j<sampl; j++)
    {
      double dv=max_norm(xyz+i*N_atom*3, xyz+j*N_atom*3, iel, N_atom, N_perm);
      x[i*sampl+j]=sqrt((Sx[i]+Sx[j]-2*dv)/N_atom); x[j*sampl+i]=x[i*sampl+j];  
    }
  }  
}
 


Но главная проблема как была так и осталась. Прибавки в скорости я не вижу совершенно, что в одном потоке, что в 2-х, почти одинаково

 Профиль  
                  
 
 Re: не работает распараллеливание в gcc
Сообщение10.05.2024, 20:27 
Заслуженный участник
Аватара пользователя


16/07/14
9202
Цюрих
Хм. Очень странно, что гонка в dv давала такой результат. Ну да бывает, наверное...
Какое у Вас получается распределение индексов по потокам - первая половина в первом, вторая во втором?

Попробуйте посмотреть в профайлер. Но мне всё еще очень не нравится x[j*sampl+i] - прыгаем по памяти, да к тому же пишем из двух потоков в соседние адреса. К тому же, если я правильно понимаю, в цикле оттуда не читаем. Что будет с производительностью, если вообще убрать это копирование?

 Профиль  
                  
 
 Re: не работает распараллеливание в gcc
Сообщение10.05.2024, 20:30 


15/12/22
198
Уменьшаю число итераций внешнего цикла вот так:
Используется синтаксис C
#pragma omp parallel num_threads(2)
{
  #pragma omp for
  for (int i=0; i<sampl/2-1; i++)
  { printf ("iteration %d, thread=%d\n", i, omp_get_thread_num());
    x[i*sampl+i]=0.0;
    for (int j=i+1; j<sampl; j++)
    {
      double dv=max_norm(xyz+i*N_atom*3, xyz+j*N_atom*3, iel, N_atom, N_perm);
      x[i*sampl+j]=sqrt((Sx[i]+Sx[j]-2*dv)/N_atom); x[j*sampl+i]=x[i*sampl+j];  
    }
  }  
}
 

и время выполнения ожидаемо уменьшается, а #pragma omp for ничего не даёт. хотя эффект должен быть тем же

-- 10.05.2024, 20:36 --

mihaild в сообщении #1638660 писал(а):
Какое у Вас получается распределение индексов по потокам - первая половина в первом, вторая во втором?

да, но по порядку первыми почему то выполняются итерации 2 потока, а в конце первого, т.е. сначала большие индексы а уже потом маленькие

 Профиль  
                  
 
 Re: не работает распараллеливание в gcc
Сообщение10.05.2024, 20:39 
Заслуженный участник
Аватара пользователя


16/07/14
9202
Цюрих
Missir в сообщении #1638661 писал(а):
да, но по порядку первыми почему то выполняются итерации 2 потока, а в конце первого, т.е. сначала большие индексы а уже потом маленькие
Это строго? Т.е. сначала (sampl / 2, 1), ..., (sampl - 1, 1) в таком порядке, а потом (0, 0), (1, 0), ..., (sampl / 2 - 1, 1)?

 Профиль  
                  
 
 Re: не работает распараллеливание в gcc
Сообщение10.05.2024, 20:40 


15/12/22
198
mihaild в сообщении #1638660 писал(а):
Что будет с производительностью, если вообще убрать это копирование?

закомментировал строки с x[j*sampl+i], в скорости абсолютно никаких изменений

-- 10.05.2024, 20:41 --

mihaild в сообщении #1638663 писал(а):
Это строго?

нет не строго, но тенденция проявляется отчётливо

в общем сначала идут 0 1 1 0 1 1 0 1 1 0, т.е. одно ядро как бы перегружено, а в конце идут одни нули, те что остались

но у меня двухядерная машина, наверное так и должно быть, ведь тут и система и инет и т.д. и т.п, одно ядро подгружают

 Профиль  
                  
 
 Re: не работает распараллеливание в gcc
Сообщение10.05.2024, 20:53 
Заслуженный участник
Аватара пользователя


16/07/14
9202
Цюрих
А, я не заметил - у Вас же вторая половина итераций сильно быстрее - второй поток делает в 3 раза меньше работы, чем первый (хотя всё равно ускорение на четверть должно быть).
Попробуйте #pragma omp for schedule(static, что-нибудь порядка sampl / 100)

 Профиль  
                  
 
 Re: не работает распараллеливание в gcc
Сообщение10.05.2024, 21:08 


15/12/22
198
Скорость точно такая же, более того, запускал эту программу на 4-х ядерной машине - прибавки в скорости тоже абсолютно никакой,
вроде как бы всё и работает, но толку никакого. Но прирост в скорости ведь должен быть

 Профиль  
                  
 
 Re: не работает распараллеливание в gcc
Сообщение10.05.2024, 21:13 
Заслуженный участник
Аватара пользователя


16/07/14
9202
Цюрих
А у Вас же все итерации получаются независимы друг от друга? Тогда еще можно попробовать объединить внешний и внутренний цикл в один.
max_norm куда-нибудь что-то пишет, или только читает?
В загрузке системы видно что заняты два ядра, или одно?

 Профиль  
                  
 
 Re: не работает распараллеливание в gcc
Сообщение10.05.2024, 21:26 


15/12/22
198
Независимы, но получается так. Я пробовал делить всё поровну на 2 секции и запускал через sections
тоже все ядра как бы загружены, но эффект нулевой.
У меня есть ещё одно подозрение, а tm=clock(); вообще адекватно работает в параллельном режиме?
а то может ускорение и есть, а я его просто не вижу?

 Профиль  
                  
 
 Re: не работает распараллеливание в gcc
Сообщение10.05.2024, 21:37 
Заслуженный участник
Аватара пользователя


16/07/14
9202
Цюрих
А, это правильное наблюдение:)
clock замеряет процессорное время процесса. Соответственно в многопоточном варианте оно легко может идти быстрее астрономического.

 Профиль  
                  
 
 Re: не работает распараллеливание в gcc
Сообщение10.05.2024, 21:48 


15/12/22
198
Действительно, проблема в clock(), заменил его на time(NULL), теперь показывает в однопоточном режиме 5s, а в 2-х поточном 2 секунды. Но time() даёт целое число секунд, а как бы получить его в миллисекундах, или микросекундах??? чтобы точнее измерить

 Профиль  
                  
 
 Re: не работает распараллеливание в gcc
Сообщение10.05.2024, 22:00 
Заслуженный участник
Аватара пользователя


16/07/14
9202
Цюрих
В С, насколько я знаю, переносимого способа нет. На линуксе есть gettimeofday и clock_gettime, на альтернативных ОС наверное тоже что-то есть.
В C++ есть std::chrono.

 Профиль  
                  
 
 Re: не работает распараллеливание в gcc
Сообщение11.05.2024, 00:25 
Заслуженный участник


20/08/14
11867
Россия, Москва
Под виндой удобна GetTickCount().

 Профиль  
                  
 
 Re: не работает распараллеливание в gcc
Сообщение11.05.2024, 01:03 


15/12/22
198
mihaild в сообщении #1638672 писал(а):
На линуксе есть gettimeofday и clock_gettime

уж не знаю почему, но эти функции у меня выдают очень сомнительные результаты так, что использовать их не получилось. Пришлось обходиться time(NULL) она работает вполне корректно, проверял по секундомеру. Для точности, поместил этот фрагмент в цикл на 100 повторений. Лучше всего использовать schedule(static, 1) и максимальное число потоков nls в num_threads(nls) , оно обычно в 2 раза больше числа ядер. При таких настройках на 2-х ядерном компе получается ускорить в 2.1-2.3 раза, а на 4-х ядерном - в 4.2-4.5 раз.

-- 11.05.2024, 01:15 --

В общем похоже вопрос решен. Всем большое спасибо за помощь, особенно mihaild

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 30 ]  На страницу Пред.  1, 2

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group