2014-10-10 16 views
1

我使用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的共享库没有安装在网格的其他计算机,但我不知道,我不知道如何验证。

非常感谢您的任何建议。

+0

为了帮助诊断进一步你可以把打印语句之前和'垫后M'声明。我怀疑你在执行节点上缺少lib是正确的。你有交互式的ssh访问这些节点吗? – Vince 2014-10-11 22:34:46

+0

@Vince:是的,我有权访问这些节点。我是否必须将库安装到所有这些节点?也许我只需要修改sge_conf文件并更改SET_LIB_PATH变量? (http://linux.die.net/man/5/sge_conf) – Khue 2014-10-13 13:49:19

+0

这些库需要可供所有想要提交作业的队列中的所有执行节点访问。如果执行节点可以访问共享位置,例如NFS挂载,则可以在那里安装这些库。否则,您需要在所有执行节点上安装所需的库。有关SET_LIB_PATH的其他链接:https://blogs.oracle.com/templedf/entry/inheriting_job_environment。虽然这有助于指向正确的位置,但图书馆仍然需要访问。 – Vince 2014-10-14 12:36:58

回答

0

的库需要注册后才能要提交作业在队列中的所有执行节点访问。如果执行节点可以访问共享位置,例如NFS挂载,则可以在那里安装这些库。否则,您需要在所有执行节点上安装所需的库。附加链接关于SET_LIB_PATH:

blogs.oracle.com/templedf/entry/inheriting_job_environment

虽然这将有助于点到正确的位置,图书馆仍然需要访问