Fortran:如何优化输入数据,以便可以全局使用它,而无需复制它

时间:2020-07-30 09:25:49

标签: arrays optimization input fortran global-variables

我目前正在编写一个处理(可能很大)数据数组的Fortran子例程。我正在使用来自多个模块的多个子例程,并且希望将输入数据数组以及输出数据数组作为全局变量,以便可以在每个子例程中读取/写入它们。但是,我想避免不必要地复制数据数组,因为我担心它会减慢整个程序的速度(如前所述,数据数组可能非常大,大约有10.000x5个条目)。

此刻,我使用一个变量模块,其中包含所有子例程的全局变量。我将输入和输出数组读入子例程,然后将输入值复制到全局数组,执行计算,然后将全局输出数组复制到子例程中的输出数组。子例程的代码如下:

subroutine flexible_clustering(data_array_in, limits_in, results_array_out)
    use globalVariables_mod
    use clusterCreation_mod
    use clusterEvaluation_mod
    implicit none

    real*8, dimension(:,:) :: data_array_in
    real*8, dimension(:) :: limits_in

    real*8, dimension(:,:) :: results_array_out

    ! determine dimensions
    data_entries_number = size(data_array_in(:,1))
    data_input_dimension = size(data_array_in(1,:))
    data_output_dimension = size(results_array_out(1,:))

    ! allocate and fill arrays
    call allocate_global_variable_arrays()
    data_array = data_array_in
    limits = limits_in

    ! clustering
    call cluster_creation()

    call cluster_evaluation()

    results_array_out = results_array

    call reset_global_variables()  
  end subroutine flexible_clustering

此处使用的全局变量在globalVariables_mod中定义如下(带有适当的allocate / deallocate子例程):

  integer :: data_entries_number = 0, data_input_dimension = 0, data_output_dimension = 0
  integer :: total_cluster_number = 0
  real*8, allocatable, dimension(:) :: limits
  real*8, allocatable, dimension(:,:) :: data_array
  real*8, allocatable, dimension(:,:) :: results_array

总结一下,我将data_array_in,limits_in和results_array_out复制到data_array,limits和results_array,以使其成为所有子例程中的全局变量。

是否可以忽略此复制?也许使用指针?我可以用另一种方式优化吗?

谢谢!

0 个答案:

没有答案