【发布时间】:2013-10-01 05:57:46
【问题描述】:
我最近开始玩 OpenMP 并且非常喜欢它。
我是一个有趣的 Classic-VB 程序员,喜欢用 C 为我的 VB 程序编写函数。因此,我使用 Windows 7 x64 和 GCC 4.7.2。 我通常在一个大的 C 文件中设置我的所有 C 函数,然后从中编译一个 DLL。现在我想在我的 DLL 中使用 OpenMP。
首先,我建立了一个简单的例子,并从中编译了一个exe文件:
#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int n = 520000;
int i;
int a[n];
int NumThreads;
omp_set_num_threads(4);
#pragma omp parallel for
for (i = 0; i < n; i++)
{
a[i] = 2 * i;
NumThreads = omp_get_num_threads();
}
printf("Value = %d.\n", a[77]);
printf("Number of threads = %d.", NumThreads);
return(0);
}
我使用 gcc -fopenmp !MyC.c -o !MyC.exe 编译它,它就像一个魅力。
但是,当我尝试在我的 DLL 中使用 OpenMP 时,它会失败。比如我设置了这个函数:
__declspec(dllexport) int __stdcall TestAdd3i(struct SAFEARRAY **InArr1, struct SAFEARRAY **InArr2, struct SAFEARRAY **OutArr) //OpenMP Test
{
int LengthArr;
int i;
int *InArrElements1;
int *InArrElements2;
int *OutArrElements;
LengthArr = (*InArr1)->rgsabound[0].cElements;
InArrElements1 = (int*) (**InArr1).pvData;
InArrElements2 = (int*) (**InArr2).pvData;
OutArrElements = (int*) (**OutArr).pvData;
omp_set_num_threads(4);
#pragma omp parallel for private(i)
for (i = 0; i < LengthArr; i++)
{
OutArrElements[i] = InArrElements1[i] + InArrElements2[i];
}
return(omp_get_num_threads());
}
当然,结构是定义好的。我编译使用
gcc -fopenmp -c -DBUILD_DLL dll.c -o dll.o
gcc -fopenmp -shared -o mydll.dll dll.o -lgomp -Wl,--add-stdcall-alias
编译器和链接器不会抱怨(甚至不会出现警告),实际上正在构建 dll 文件。但是当我尝试从 VB 中调用该函数时,VB 编译器声称找不到 DLL 文件(运行时错误 53)。奇怪的是,只要 .c 文件中存在一个 OpenMP“命令”,VB 编译器就会声称缺少 DLL,即使我调用的函数甚至不包含一行 OpenMP 代码。当我注释掉所有 OpenMP 内容时,该函数按预期工作,但当然不使用 OpenMP 进行并行化。
这里有什么问题?任何帮助表示赞赏,在此先感谢! :-)
【问题讨论】: