Вот минимальный рабочий код.
program test
implicit none
double precision:: c1,c2,rate
integer::ci,cj,cr,cm,i
integer,parameter::max_iter=10000000 !10^7
c1=0.0d+0
CALL system_clock(count_rate=cr)
CALL system_clock(count_max=cm)
rate = REAL(cr)
CALL SYSTEM_CLOCK(ci)
do i=1,max_iter
c1=c1+log(DBLE(i))
end do
CALL SYSTEM_CLOCK(cj)
WRITE(*,*) "system_clock : ",(cj - ci)/rate
print*, c1
end program test
Когда я компилирую с gfortran -Ofast -march=core-avx2 -fopt-info-vec-optimized
, для l oop с функцией log не получается векторизация. Я также пробовал с -O3
, но результат не меняется.
Но если я напишу эквивалентный код C ++,
#include <iostream>
#include <chrono>
#include <cmath>
using namespace std;
using namespace std::chrono;
int main()
{
double c1=0;
const int max_iter=10000000; // 10^7
auto start = high_resolution_clock::now();
for(int i=1;i<=max_iter;i++)
{
c1 += log(i);
}
auto stop = high_resolution_clock::now();
auto duration = duration_cast<milliseconds>(stop - start);
cout << duration.count() << " ms"<<'\n';
printf("%0.15f\n",c1);
return 0;
}
и скомпилирую его с g++ -Ofast -march=core-avx2 -fopt-info-vec-optimized
, для oop становится векторизованным и работает почти в 10 раз быстрее.
Что я должен сделать, чтобы сделать вортран l oop векторизованным?