Advertisement
Guest User

Untitled

a guest
Oct 6th, 2015
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.27 KB | None | 0 0
  1. module test
  2. implicit none
  3. private
  4. public fib
  5.  
  6. contains
  7.  
  8. ! Fibonacci function
  9. integer recursive function fib(n) result(r)
  10. integer, intent(in) :: n
  11. if (n < 2) then
  12. r = n
  13. else
  14. r = fib(n-1) + fib(n-2)
  15. end if
  16. end function ! end of Fibonacci function
  17. end module
  18.  
  19. program fibonacci
  20. use test, only: fib
  21. implicit none
  22. integer :: r,i
  23. integer :: n = 1e09
  24. real(8) :: start, finish, cum_time
  25.  
  26. cum_time=0
  27. do i= 1,n
  28. call cpu_time(start)
  29. r = fib(20)
  30. call cpu_time(finish)
  31. cum_time = cum_time + (finish - start)
  32. if (cum_time >0.5) exit
  33. enddo
  34.  
  35. print*,i,'runs, average elapsed time is', cum_time/i/1e-06, 'us'
  36. end program
  37.  
  38. gfortran -O3 -march=native
  39.  
  40. #include <iostream>
  41. #include <chrono>
  42. using namespace std;
  43.  
  44. // Fib function
  45. int fib(const int n)
  46. {
  47. int r;
  48. if (n < 2)
  49. r = n;
  50. else
  51. r = fib(n-1) + fib(n-2);
  52. return r;
  53. } // end of fib
  54.  
  55. template<typename T, typename ... Args>
  56. double timeit(T (*func)(Args...), Args...args)
  57. {
  58. double counter = 1.0;
  59. double mean_time = 0.0;
  60. for (auto iter=0; iter<1e09; ++iter){
  61. std::chrono::time_point<std::chrono::system_clock> start, end;
  62. start = std::chrono::system_clock::now();
  63.  
  64. func(args...);
  65.  
  66. end = std::chrono::system_clock::now();
  67. std::chrono::duration<double> elapsed_seconds = end-start;
  68.  
  69. mean_time += elapsed_seconds.count();
  70. counter++;
  71.  
  72. if (mean_time > 0.5){
  73. mean_time /= counter;
  74. std::cout << static_cast<long int>(counter)
  75. << " runs, average elapsed time is "
  76. << mean_time/1.0e-06 << " xC2xB5s" << std::endl;
  77. break;
  78. }
  79. }
  80. return mean_time;
  81. }
  82.  
  83. int main(){
  84. timeit(fib,20);
  85. return 0;
  86. }
  87.  
  88. g++ -O3 -march=native
  89.  
  90. Fortran: 24991 runs, average elapsed time is 20.087 us
  91. C++ : 12355 runs, average elapsed time is 40.471 µs
  92.  
  93. .L28:
  94. cmpl $1, %r13d
  95. jle .L29
  96. leal -8(%rbx), %eax
  97. movl %ecx, 12(%rsp)
  98. movl %eax, 48(%rsp)
  99. leaq 48(%rsp), %rdi
  100. leal -9(%rbx), %eax
  101. movl %eax, 16(%rsp)
  102. call __bench_MOD_fib
  103. leaq 16(%rsp), %rdi
  104. movl %eax, %r13d
  105. call __bench_MOD_fib
  106. movl 12(%rsp), %ecx
  107. addl %eax, %r13d
  108.  
  109. .L28:
  110. movl 72(%rsp), %edx
  111. cmpl $1, %edx
  112. movl %edx, %eax
  113. jle .L33
  114. subl $3, %eax
  115. movl $0, 52(%rsp)
  116. movl %eax, %esi
  117. movl %eax, 96(%rsp)
  118. movl 92(%rsp), %eax
  119. shrl %eax
  120. movl %eax, 128(%rsp)
  121. addl %eax, %eax
  122. subl %eax, %esi
  123. movl %edx, %eax
  124. subl $1, %eax
  125. movl %esi, 124(%rsp)
  126. movl %eax, 76(%rsp)
  127.  
  128. // Fib function
  129. int fib(const int n)
  130. {
  131. int r;
  132. if (n < 2)
  133. r = n;
  134. else
  135. r = fib(n-1) + fib(n-2);
  136. asm("");
  137. return r;
  138. } // end of fib
  139.  
  140. .L7:
  141. cmpl $1, %edx
  142. jle .L17
  143. leal -4(%rbx), %r13d
  144. leal -5(%rbx), %edx
  145. cmpl $1, %r13d
  146. jle .L19
  147. leal -5(%rbx), %r14d
  148. cmpl $1, %r14d
  149. jle .L55
  150. leal -6(%rbx), %r13d
  151. movl %r13d, %edi
  152. call _Z3fibi
  153. leal -7(%rbx), %edi
  154. movl %eax, %r15d
  155. call _Z3fibi
  156. movl %r13d, %edi
  157. addl %eax, %r15d
  158.  
  159. Fortran: 24991 runs, average elapsed time is 20.087 us
  160. C++ : 25757 runs, average elapsed time is 19.412 µs
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement