Я использую Grid Engine кластер для запуска некоторого кода 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;
}
Код скомпилирован без ошибок.
При локальном исполнении, т.е.
username@machine:~/code$ ./test
он создает подпапку, т.е. ~/code/sub
, как и ожидалось.
Для отправки в сетку я создал скрипт работы job.sh
в домашнем каталоге (т.е. ~/job.sh
) содержащий
cd code/
./test
а затем отправить с помощью
qsub job.sh
Ничего не случилось. (И без ошибок).
Тем не менее, когда я удалил линию
Mat M;
это создало папку как ожидалось.
Каковы возможные причины такого поведения? Я думаю о чем-то вроде общих библиотек OpenCV, которые не были установлены на других компьютерах сети, но я не уверен и не знаю, как это проверить.
Заранее благодарю за любые предложения.
Библиотеки должны быть доступны для всех исполнительных узлов в очереди, в которую вы хотите отправить задание. Если исполнительные узлы имеют доступ к общему расположению, например, к монтированию NFS, вы можете установить библиотеки там. В противном случае вам нужно установить необходимые библиотеки на всех исполнительных узлах. Дополнительная ссылка относительно SET_LIB_PATH:
blogs.oracle.com/templedf/entry/inheriting_job_environment
Хотя это поможет указать правильное местоположение, библиотеки по-прежнему должны быть доступны