一个应用程序中的多个Intel OpenMP库可能会导致正确性问题

时间:2013-09-02 11:31:39

标签: dll openmp intel

英特尔页面说:

  

因为一个应用程序中的多个OpenMP库会导致性能问题(线程太多),如果初始化了多个副本,可能会导致正确性问题。

我们将我们的库与libiomp5md.dll链接并随之分发。我们的客户有一个问题,他使用另一个使用libiomp5mt.lib的第三方库。使用最新的英特尔MKL重建第三方应用程序并不是一个简单的过程。

如果初始化多个副本,我无法找到“正确性问题”的意思。您是否可以解释一下“复制”是什么以及“多个副本”是什么?

1 个答案:

答案 0 :(得分:0)

“copy”表示运行时内存中OpenMP库的实例。只要所有代码动态链接到libiopm5md.dll,就不应该出现问题 - 您最终应该使用OpenMP运行时的单个实例。但是,如果DLL“A”与OpenMP库静态链接而另一个DLL“B”是动态链接的,则最终可能会有两个库副本,一个在“A”内,另一个为“B”动态加载。 ”

正确性问题的一个例子是threadprivate变量曾经使用库内的哈希表实现,因此每个副本都有自己的哈希表。因此,给定一个threadprivate变量“X”,一个线程可能会看到它在同一个线程中的DLL“A”和“B”内部有不同的位置。

正确性问题的另一个例子是在DLL之间移动指针。一个DLL可以分配内存并将指针发送到另一个。如果另一个DLL尝试释放指针,结果将取决于DLL是否使用相同的内存分配器实例。

名称冲突可能会产生更微妙的问题。如果OpenMP运行时的两个副本在应用程序中工作,则某些代码可能会意外地调用OpenMP的错误实例。结果可能是无声的错误执行。

实际上,精心编写的代码可能在内存中有多个OpenMP运行时实例,但我们无法保证任何代码。

安德烈