我使用Grid Engine群集运行一些OpenCV的代码。代码在本地执行时运行良好,但是当提交到网格时它不起作用。我在这里提取一个最小的例子。网格引擎集群+ OpenCV的:奇怪的行为
在目录~/code/
我有一个文件test.cpp
包含以下代码:
#include <opencv2/core.hpp>
#include <iterator>
#include <string>
#include <sys/types.h>
#include <sys/stat.h>
using namespace cv;
using namespace std;
int main(int ac, char** av)
{
/// Create a random matrix
Mat M;
/// Create a subfolder
string folderName = "sub/";
mkdir(folderName.c_str(),0777);
return 0;
}
的代码是没有错误编译。
当本地执行,即
[email protected]:~/code$ ./test
它创建一个子文件夹,即~/code/sub
,如所预期。
提交到网格,我在含
cd code/
./test
主目录(即~/job.sh
)创建的作业脚本job.sh
,然后提交使用
qsub job.sh
什么也没发生。 (并没有错误)。
然而,当我删除了行
Mat M;
它没有创建文件夹,如预期。
这种行为的可能原因是什么?我想像OpenCV的共享库没有安装在网格的其他计算机,但我不知道,我不知道如何验证。
非常感谢您的任何建议。
为了帮助诊断进一步你可以把打印语句之前和'垫后M'声明。我怀疑你在执行节点上缺少lib是正确的。你有交互式的ssh访问这些节点吗? – Vince 2014-10-11 22:34:46
@Vince:是的,我有权访问这些节点。我是否必须将库安装到所有这些节点?也许我只需要修改sge_conf文件并更改SET_LIB_PATH变量? (http://linux.die.net/man/5/sge_conf) – Khue 2014-10-13 13:49:19
这些库需要可供所有想要提交作业的队列中的所有执行节点访问。如果执行节点可以访问共享位置,例如NFS挂载,则可以在那里安装这些库。否则,您需要在所有执行节点上安装所需的库。有关SET_LIB_PATH的其他链接:https://blogs.oracle.com/templedf/entry/inheriting_job_environment。虽然这有助于指向正确的位置,但图书馆仍然需要访问。 – Vince 2014-10-14 12:36:58