update
This commit is contained in:
		
							
								
								
									
										89
									
								
								2025.04.03_time_of_fotran_mkl_and_python_numpy/a.f90
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								2025.04.03_time_of_fotran_mkl_and_python_numpy/a.f90
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,89 @@ | ||||
| ! This code is supported by the website: https://www.guanjihuan.com | ||||
| ! The newest version of this code is on the web page: https://www.guanjihuan.com/archives/45966 | ||||
|  | ||||
| module random_matrix_mod | ||||
|     implicit none | ||||
|     contains | ||||
|         subroutine generate_random_matrix(n, A) | ||||
|             integer, intent(in) :: n | ||||
|             double precision, allocatable, intent(out) :: A(:,:) | ||||
|             integer :: ierr | ||||
|              | ||||
|             allocate(A(n, n), stat=ierr) | ||||
|             if (ierr /= 0) stop "内存分配失败" | ||||
|              | ||||
|             call init_random_seed() | ||||
|             call random_number(A) | ||||
|         end subroutine | ||||
|  | ||||
|         subroutine init_random_seed() | ||||
|             integer :: i, n, clock, ierr | ||||
|             integer, allocatable :: seed(:) | ||||
|              | ||||
|             call random_seed(size = n) | ||||
|             allocate(seed(n), stat=ierr) | ||||
|             if (ierr /= 0) stop "种子分配失败" | ||||
|              | ||||
|             call system_clock(count=clock) | ||||
|             seed = clock + 37 * [(i - 1, i = 1, n)] | ||||
|             call random_seed(put=seed) | ||||
|              | ||||
|             deallocate(seed) | ||||
|         end subroutine | ||||
| end module | ||||
|  | ||||
| program main | ||||
|     use random_matrix_mod | ||||
|     use f95_precision | ||||
|     use blas95 | ||||
|     use lapack95 | ||||
|     implicit none | ||||
|  | ||||
|     integer, allocatable :: index1(:) | ||||
|     integer n, i, j, info, ierr, stage, start, end_val, step, count_start, count_end, count_rate | ||||
|     double precision, allocatable :: A(:,:) | ||||
|     double precision time_used | ||||
|  | ||||
|     ! 定义不同阶段的参数 | ||||
|     do stage = 1, 3 | ||||
|         select case(stage) | ||||
|         case(1)  ! 第一阶段:100-1000,步长100 | ||||
|             start = 100 | ||||
|             end_val = 1000 | ||||
|             step = 100 | ||||
|         case(2)  ! 第二阶段:2000-10000,步长1000 | ||||
|             start = 2000 | ||||
|             end_val = 10000 | ||||
|             step = 1000 | ||||
|         case(3)  ! 第三阶段:20000-50000,步长10000 | ||||
|             start = 20000 | ||||
|             end_val = 50000 | ||||
|             step = 10000 | ||||
|         end select | ||||
|  | ||||
|         n = start | ||||
|         do while (n <= end_val) | ||||
|  | ||||
|             allocate(index1(n), stat=ierr) | ||||
|             call generate_random_matrix(n, A) | ||||
|  | ||||
|             call system_clock(count_start, count_rate) | ||||
|             call getrf(A, index1, info);  call getri(A, index1, info)  ! 使用 getrf 和 getri 对矩阵求逆。这时候 A 不再是原来的矩阵了,而是求逆后的矩阵。 | ||||
|             call system_clock(count_end) | ||||
|  | ||||
|             ! 打印计算时间 | ||||
|             if (count_rate > 0) then | ||||
|                 time_used = real(count_end - count_start) / real(count_rate) | ||||
|                 write(*, '(a, I6, a, f12.6, a)') 'n = ', n, ' 的计算时间: ', time_used, ' 秒' | ||||
|             else | ||||
|                 write(*,*) "无法获取计算时间" | ||||
|             endif | ||||
|  | ||||
|             deallocate(A, stat=ierr) | ||||
|             deallocate(index1, stat=ierr) | ||||
|  | ||||
|             n = n + step | ||||
|         end do | ||||
|     end do | ||||
|  | ||||
| end program | ||||
							
								
								
									
										18
									
								
								2025.04.03_time_of_fotran_mkl_and_python_numpy/a.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								2025.04.03_time_of_fotran_mkl_and_python_numpy/a.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | ||||
| """ | ||||
| This code is supported by the website: https://www.guanjihuan.com | ||||
| The newest version of this code is on the web page: https://www.guanjihuan.com/archives/45966 | ||||
| """ | ||||
|  | ||||
| import numpy as np | ||||
| import time | ||||
|  | ||||
| n_array = np.concatenate((np.arange(100, 1000, 100), | ||||
|                           np.arange(1000, 10000, 1000), | ||||
|                           np.arange(10000, 60000, 10000))) | ||||
|  | ||||
| for n in n_array: | ||||
|     A = np.random.rand(n, n) | ||||
|     start_time = time.time() | ||||
|     inv_A = np.linalg.inv(A) | ||||
|     inv_time = time.time() - start_time | ||||
|     print(f"n = {n} 的计算时间: {inv_time:.6f} 秒") | ||||
		Reference in New Issue
	
	Block a user