我有一个使用libraberto.so
编译的共享库PGCC
。它包含OpenACC pragma伪指令,并使用-acc
标志进行编译,以确保启用这些伪指令。相应的makefile规则是:
libraberto.so: file1.o file2.o ...
pgcc -shared -o./libraberto.so file1.o file2.o ...
%.o: %.c
pgcc -acc -Minfo=accel -c -fpic -I./inc/ -o./$@ $<
file1.c
,file2.c
等是构成图书馆的源文件。
然后我有一个mex_gateway.c
文件,它只是从MATLAB中调用共享库中的例程,传递变量(数组和标量),然后接收输出数组。编译如下:
mex -lraberto mex_gateway.c
编译工作正常,但是当我尝试在MATLAB中运行网关时,我收到以下错误:
Invalid MEX-file '[...]/mex_gateway.mexa64':
[...]/libraberto.so: undefined symbol: __pgi_uacc_dataenterstart
我无法在Google上找到有关此特定错误(符号)的任何信息,也不确定在我的代码中查找的位置。在没有OpenACC指令(即没有-acc
)的情况下编译共享库时,该程序工作正常。我认为错误可能是由于MEX使用的数组的特殊性质(mxArray
),在将数据传输到加速器时可能不会很好地与OpenACC一起使用,但是memcpy
输入到在将它们传递给共享库例程之前,真正的malloc
'C数组没有任何区别。