Форум программистов, компьютерный форум, киберфорум
Fortran
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 31.08.2013
Сообщений: 19
1

Динамические массивы и двухканальная память

12.01.2019, 12:08. Показов 1360. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
У меня есть 4 матрицы большой размерности A1, A2, B1, B2. В программе средствами OpenMP я создаю два потока и в каждом потоке под эти матрицы создаю динамические массивы:
поток 1: allocate(A1(M,M),B1(M,M))
поток 2: allocate(A2(M,M),B2(M,M))
и далее по ходу программы каждый поток выполняет с этими массивами матричные операции matmul, причем одновременно, т.е. в одном и том же месте программы:
...
!$omp barrier
поток 1: С1=matmul(A1,B1)
поток 2: C2=matmul(A2,B2)
!$omp barrier
...

Я бы хотел, чтобы эти массивы в момент создания размещались в участках памяти, соответствующих разным каналам. Тогда пары A1, B1 и A2, B2 при выполнении команды matmul будут считываться из памяти параллельно и не мешать друг другу. Как это можно сделать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.01.2019, 12:08
Ответы с готовыми решениями:

Динамические массивы: очищается ли память?
Здравствуйте. Подскажите, пожалуйста, по поводу динамических массивов. Допустим, есть вот такой...

Динамические массивы: выделяем и высвобождаем память
Доброго времени суток! Динамические массивы: выделяем и высвобождаем память. Но сложность в том,...

Двухканальная оперативная память на оперативке
Здравствуйте! Проблема такова, на материнской плате MSI 4е слота для оперативной памяти 2хDDR2 и...

Двухканальная память и разные модули
Доброго дня. На данный момент есть мать ASUS P8Z68V-Pro с процем i7 2600K. Установлено четыре...

5
WH
1577 / 807 / 189
Регистрация: 10.09.2013
Сообщений: 3,197
Записей в блоге: 3
13.01.2019, 12:14 2
Возможно я не точно знаю, но по моему именно двухканальным режимом работы памяти контроллер на материнской плате занимается самостоятельно, если машина поддерживает этот режим и соответственно в гнезда материки вставлено четное количество планок.
0
0 / 0 / 0
Регистрация: 31.08.2013
Сообщений: 19
13.01.2019, 12:44  [ТС] 3
WH, Вы правы. Сейчас у меня в настройках BIOS включена опция channel interleaving. Но я бы хотел знать, возможно ли вручную внутри программы распределять данные между каналами. Потоки же в рамках OpenMP можно программно привязать к конкретным ядрам.
0
WH
1577 / 807 / 189
Регистрация: 10.09.2013
Сообщений: 3,197
Записей в блоге: 3
13.01.2019, 18:33 4
Цитата Сообщение от arte-semaki Посмотреть сообщение
WH, Вы правы. Сейчас у меня в настройках BIOS включена опция channel interleaving. Но я бы хотел знать, возможно ли вручную внутри программы распределять данные между каналами.
Не скажу, нужно изучать вопрос. Но мне кажется, если у вас разные ядра процессора загружены и каждое работает с большим количеством памяти то, при возможности двухканального режима, с большой долей вероятности у вас автоматом происходит то, чего вы хотите.

Добавлено через 4 часа 44 минуты
Кстати, если вам нужно перемножать большие матрицы, то кроме matmul можете попробовать использовать OpenBLAS. Я как то ради эксперимента пробовал, это работает весьма быстро. Можете сравнить по скорости. При этом, учитывая что специальных средств распараллеливания типа OpenMP я не использовал, на моем 2-х ядерном процессоре были загружены оба ядра.
Подпрограмма перемножения матриц - sgemm.

Добавлено через 4 минуты
Вот мой тестовый вариант
Fortran
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
program matrix
implicit none
real :: a(2048,2048), b(2048,2048), c(2048,2048)
real :: start_time, end_time, time
character :: NN, MM
NN="N"; MM="N"
 
    call random_number(a)
    call random_number(b)
    call cpu_time(start_time)
 
    call sgemm (NN, MM, 2048, 2048, 2048, 1.0, a, 2048, b, 2048, 1.0, c, 2048)
 
    call cpu_time(end_time)
    time = end_time - start_time
    write(*,"(A , F7.3)") " время в секундах = ", time
end program
а компилировал по моему так
Код
gfortran sourse.f90 -L/usr/local/lib/ -llapack -lblas
или в команде компиляции возможно openblas, не помню точно, но openblas конечно должен быть уже установлен.

Добавлено через 3 минуты
А здесь документация на синтаксис
0
0 / 0 / 0
Регистрация: 31.08.2013
Сообщений: 19
13.01.2019, 18:35  [ТС] 5
WH, Я использовал dgemm из Intel MKL и OpenBLAS. По сравнению с matmul скорость работы в первом случае увеличилась на 15%, во втором - на 10%. Компилятор во всех трех случаях - ifort. Я думаю, что мои матрицы слишком маленькие, чтобы был заметен эффект от dgemm. Число элементов в каждой матрице ~100 тыс.
0
1 / 1 / 0
Регистрация: 09.04.2018
Сообщений: 8
15.01.2019, 12:38 6
Дело в том, что канальность памяти это невидимый для программиста механизм, который реализован аппаратно. Т.е. частота работы памяти гораздо меньше, чем частота работы процессора, т.о. за одно обращение по частоте мы просто считываем сразу два банка памяти, а последней проц от AMD даже сразу 8. Я так понимаю, что банки эти расположены последовательно, т.е. за одно обращение к памяти считывается столько банков, какая канальность памяти.

Далее нити OpenMP к памяти имеют совершенно равнозначный доступ на чтение. Но чтобы записывать в переменные, необходимо для каждой нити сделать собственную копию таких переменных именуемые приватные или сделать, так чтобы в матрице каждая нить записывала какие-то только свои ячейки. В перемножении матриц такое легко осуществимо каждая нить считывает свою строку в А и свой столбец в В и суммирует в С.

Параллельная реализация перемножения матриц например дано тут https://parallel.ru/tech/tech_... P/examples
0
15.01.2019, 12:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.01.2019, 12:38
Помогаю со студенческими работами здесь

Двухканальная или четырехканальная память?
Добрый день, cyberforum. Хотел бы задать вопрос, ответ на который несмотря на долгий серфинг инета...

Двухканальная оперативная память на P43ME
Не работает двухканальная оперативная память на материнской плате ASRock P43ME. Имеются две планки...

Одноканальная или двухканальная память в ультрабуке
Добрый вечер, я понимаю что двухканальная память лучше (но не понимаю насколько). Дело вот в чем,...

Динамические массивы и функции. Динамические массивы.
Дана матрица 6х8 целого типа. Создать одномерный массив, содержащий элементы матрицы, кратные...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru