Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dll Fortran共享库。所以并行_Dll_Fortran_Shared Libraries_Mpi_Fortran90 - Fatal编程技术网

Dll Fortran共享库。所以并行

Dll Fortran共享库。所以并行,dll,fortran,shared-libraries,mpi,fortran90,Dll,Fortran,Shared Libraries,Mpi,Fortran90,我已经从linux中的fortran代码创建了一个共享库libtest.so。这个libtest.so将从并行fortran代码调用 我正在对我的模拟域进行分区,每个处理器执行其分区板所需的所有必要操作。可能一个处理器需要调用此libtest.so多次用于不同的对象。但是,此共享库在内存中保留一些变量,并根据过去的值每次更新它们。显然,对于每个对象,我不希望根据其他对象的值进行更新。因此,每次调用此共享库时,都应该与对象链接,而不是与其他对象混淆 你知道我怎样才能做到这一点吗?严格来说,你不是“

我已经从linux中的fortran代码创建了一个共享库
libtest.so
。这个
libtest.so
将从并行fortran代码调用

我正在对我的模拟域进行分区,每个处理器执行其分区板所需的所有必要操作。可能一个处理器需要调用此
libtest.so
多次用于不同的对象。但是,此共享库在内存中保留一些变量,并根据过去的值每次更新它们。显然,对于每个对象,我不希望根据其他对象的值进行更新。因此,每次调用此共享库时,都应该与对象链接,而不是与其他对象混淆


你知道我怎样才能做到这一点吗?

严格来说,你不是“调用库”,而是“调用库提供的函数”。那么您的库正在使用全局变量?一个选项是实现一个类似重置的子例程,重新初始化所有全局变量。另一种选择是停止使用全局变量,而是传递一个描述状态的额外参数。然后始终使用相同的状态以保持现有行为,如果不想使用过去的值,请使用新的状态。库中的函数不是。一种解决方案是将所有数据封装在派生类型中,并将它们显式地传递给函数。@GillesGouaillardet这就是我所说的“调用库”,但很好,您进一步澄清了它。不,它没有使用全局变量,但是库在不同对象的每个时间步都被调用。因此,如果对象1在时间步N调用它,然后对象2在时间步N调用它,那么对象2将使用一些已经存储的变量来更新其参数。传递一个额外的参数会起作用,但我需要重新编程所有变量,使它们的数组大小与对象的数量相等,我宁愿避免(如果可能)…@pierredebyl即使我将它们作为派生类型传递,我也不明白为什么它会是线程安全的?根据您的描述,您正在使用带有
save
属性的局部变量,其作用域为模块或给定函数。在调用程序中声明变量意味着代码中每个“工作者”都有一份数据副本,因此没有重叠/冲突。严格来说,您不是“调用库”,而是“调用库提供的函数”。那么您的库正在使用全局变量?一个选项是实现一个类似重置的子例程,重新初始化所有全局变量。另一种选择是停止使用全局变量,而是传递一个描述状态的额外参数。然后始终使用相同的状态以保持现有行为,如果不想使用过去的值,请使用新的状态。库中的函数不是。一种解决方案是将所有数据封装在派生类型中,并将它们显式地传递给函数。@GillesGouaillardet这就是我所说的“调用库”,但很好,您进一步澄清了它。不,它没有使用全局变量,但是库在不同对象的每个时间步都被调用。因此,如果对象1在时间步N调用它,然后对象2在时间步N调用它,那么对象2将使用一些已经存储的变量来更新其参数。传递一个额外的参数会起作用,但我需要重新编程所有变量,使它们的数组大小与对象的数量相等,我宁愿避免(如果可能)…@pierredebyl即使我将它们作为派生类型传递,我也不明白为什么它会是线程安全的?根据您的描述,您正在使用带有
save
属性的局部变量,其作用域为模块或给定函数。在调用程序中声明变量意味着代码中每个“工作者”都有一个数据副本,因此没有重叠/冲突。