3

我有一个libraberto.soPGCC. 它包含 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 数组之前将它们传递给共享库例程没有区别。

4

0 回答 0