2014-10-10 2 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, как и ожидалось.

Для подачи к сетке, я создал сценарий задания job.sh в домашней директории (т.е. ~/job.sh), содержащего

cd code/ 
./test 

, а затем представить не используя

qsub job.sh 

ничего не произошло. (И никаких ошибок).

Однако, когда я снял линию

Mat M; 

он сделал создать папку, как и ожидалось.

Каковы возможные причины такого поведения? Я думаю, что что-то вроде общих библиотек OpenCV не было установлено на других компьютерах сетки, но я не уверен, и я не знаю, как это проверить.

Благодарим вас за любые предложения.

+0

Чтобы помочь диагностировать дальше Вы можете поместить оператор печати до и после 'Мата M'. Я подозреваю, что вы правы, что lib отсутствует на узлах выполнения. У вас есть интерактивный доступ ssh к этим узлам? – Vince

+0

@Vince: Да, у меня есть доступ к этим узлам. Нужно ли устанавливать библиотеки на все эти узлы? Может быть, мне нужно только изменить файл sge_conf и изменить переменную SET_LIB_PATH? (http://linux.die.net/man/5/sge_conf) – Khue

+0

Библиотеки должны быть доступны для всех узлов выполнения в очереди, в которую вы хотите отправить задание. Если узлы выполнения имеют доступ к общему месту, например монтированию NFS, вы можете установить там библиотеки. В противном случае вам необходимо установить необходимые библиотеки на все узлы выполнения. Дополнительная ссылка относительно SET_LIB_PATH: https://blogs.oracle.com/templedf/entry/inheriting_job_environment. Хотя это поможет указать на правильное местоположение, библиотеки все же должны быть доступны. – Vince

ответ

0

Библиотеки должны быть доступны для всех исполнительных узлов в очереди, в которую вы хотите отправить задание. Если узлы выполнения имеют доступ к общему месту, например монтированию NFS, вы можете установить там библиотеки. В противном случае вам необходимо установить необходимые библиотеки на все узлы выполнения. Дополнительная ссылка относительно SET_LIB_PATH:

blogs.oracle.com/templedf/entry/inheriting_job_environment

Хотя это помогло бы точке в нужное место, библиотеки по-прежнему должны быть доступны

Смежные вопросы