Извините за возможное дублирование. О проблеме. numpy (1.18.2) в python 3.8.2 дает мне очень высокую скорость моделирования (в 3 раза быстрее) для матричного продукта по сравнению с GNU Fortran (9.2.0 MinGW.org G CC Build-20200227- 1) под Windows. Я использовал команду gfortran.exe test.f
без каких-либо дополнительных опций.
Кто-нибудь знает, что вызывает это, и возможно ли увеличить скорость симуляции в Фортране?
Вот код Фортрана:
program product_test
INTEGER :: N,N_count,i,j,k,nc
REAL*8 :: t1,t2
REAL*8,dimension (:,:), allocatable :: a,b,c
N = 200
N_count = 10
allocate ( a(N,N) )
allocate ( b(N,N) )
allocate ( c(N,N) )
call RANDOM_NUMBER(a)
call RANDOM_NUMBER(b)
print *, 'Matrix Multiplication: C = A * B for size (',N,',',N,')'
call CPU_TIME ( time_begin )
do nc=1,N_count
c = MATMUL(a,b)
end do
call CPU_TIME ( time_end )
t2 = (time_end - time_begin)/N_count
print *, 'Time of operation was ', t2, ' seconds'
end
Вот вывод:
Умножение матрицы: C = A * B для размера (200, 200)
Время работы было 9.3749 E-003 секунд
Вот код python 3:
import numpy as np
import time
N = 200
N_count = 10
a = np.random.rand(N,N)
b = np.random.rand(N,N)
c = np.zeros([N,N], dtype = float)
print('Matrix product in python (using numpy): c= a*b for size (',N,',',N,')')
start_time = time.time()
for nc in range(N_count):
c = a@b
t2 = (time.time() - start_time)/N_count
print('Elapsed time = ',t2,'s')
Вот результат:
Матричный продукт в python (с использованием numpy): c = a * b для размера (200, 200)
Истекшее время = 0,0031252 s
I извините Чтобы избежать недоразумений, я удалил ту часть кода, которая не была посвящена моему вопросу.
Дополнительные тесты. после комментариев "roygvib" и " Владимир Ф ", я сделал тест с блас / лапак:
gfortran test.f -lopenblas -o test.exe
или gfortran test.f -ffast-math -o test.exe
или gfortran test.f -lblas -o test.exe
или gfortran test.f -llapack -o test.exe
дайте мне время расчета 0,0063 с для матричное умножение квадратных матриц с размером (200 x 200).
К сожалению, я удалил предыдущую версию mingw, и были выполнены новые тесты под GNU Fortran (x86_64-posix-seh-rev0, созданный MinGW -W64 проект 8.1.0). Может быть, я сделал что-то неправильно, потому что нет никакой разницы между -llapack
, -lblas
, -lopenblas
. Для измерения времени я использовал SYSTEM_CLOCK
, как предложил «Владимир Ф.».
Теперь это лучше, но numpy все же быстрее, чем фортран (не три раза, а два раза). Следуя последнему комментарию «Владимир Ф», я обнаружил, что в отличие от Python, Fortran использует в основном одно логическое ядро (на моем P C есть 4 логических ядра с процессором Intel i3). Таким образом, это проблема неправильно настроенного MinGW на моем P C (Windows8.1).