Я использую кластер 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 не было установлено на других компьютерах сетки, но я не уверен, и я не знаю, как это проверить.
Благодарим вас за любые предложения.
Чтобы помочь диагностировать дальше Вы можете поместить оператор печати до и после 'Мата M'. Я подозреваю, что вы правы, что lib отсутствует на узлах выполнения. У вас есть интерактивный доступ ssh к этим узлам? – Vince
@Vince: Да, у меня есть доступ к этим узлам. Нужно ли устанавливать библиотеки на все эти узлы? Может быть, мне нужно только изменить файл sge_conf и изменить переменную SET_LIB_PATH? (http://linux.die.net/man/5/sge_conf) – Khue
Библиотеки должны быть доступны для всех узлов выполнения в очереди, в которую вы хотите отправить задание. Если узлы выполнения имеют доступ к общему месту, например монтированию NFS, вы можете установить там библиотеки. В противном случае вам необходимо установить необходимые библиотеки на все узлы выполнения. Дополнительная ссылка относительно SET_LIB_PATH: https://blogs.oracle.com/templedf/entry/inheriting_job_environment. Хотя это поможет указать на правильное местоположение, библиотеки все же должны быть доступны. – Vince