首页 理论教育基于线程的并行计算:ABAQUS有限元子程序的开发与应用

基于线程的并行计算:ABAQUS有限元子程序的开发与应用

【摘要】:在基于线程的并行计算中,对于公共空间的变量或者共享的资源,需要进行额外的保护。它们的编号为1~10,开发者可以通过它们的编号进行使用。初始化互斥锁的最佳位置在子程序uexternaldb中。示例如下:经过上面代码的计算,1号互斥锁(#1)就可以在其他要被调用的用户子程序中使用了,以保护对共享公用块中变量的访问,防止其被多个互相竞争的线程同时访问而造成破坏。

在基于线程的并行计算中,对于公共空间的变量或者共享的资源,需要进行额外的保护。例如,common block中的变量或module中的变量就是公共空间变量,而文件就是共享的资源,这些都需要进行额外的保护。这是因为,在多线程执行的情况下,多个线程可能会尝试同时向一个文件中写入数据,或同时对同一个公共变量进行赋值。对比,程序总是会保留最后一个线程的写入数据或存储的变量值,其他线程的数据或变量值则被覆盖,而我们无法预期到底哪一个线程是最后一个线程,这不是我们希望的结果。

为了避免上述问题的出现,可以使用下面的语句(函数):

1)get_thread_id

这个函数允许我们区分0线程(第一个线程)和其他线程。这对于将某些特殊的任务仅限制到线程0非常有用。这些特殊任务通常包括I/O操作(特别是打开和关闭文件)和执行单点初始化。示例如下:

2)Mutexes(互斥执行锁、互斥锁)(www.chuimin.cn)

如果某段代码已经在被一个线程执行,那么互斥锁可以阻止其他线程进入这段代码。它是一种避免线程之间互相竞争的机制(即所有线程不能同时修改一些公共变量的值)。

ABAQUS提供了10个预定义的互斥锁供用户使用。它们的编号为1~10,开发者可以通过它们的编号进行使用。一个互斥锁在被使用之前需要进行初始化。初始化互斥锁的最佳位置在子程序uexternaldb中(这个子程序在整个分析的一开始就会被执行)。示例如下:

经过上面代码的计算,1号互斥锁(#1)就可以在其他要被调用的用户子程序中使用了,以保护对共享公用块中变量的访问,防止其被多个互相竞争的线程同时访问而造成破坏。示例如下(这里以用户子程序uvarm为例):

上述代码中的第8~14行就是“上锁→给公共变量赋值→解锁”过程的具体实现。