Я настраиваю среду параллельной оптимизации, используя IBM CPLEX 12.9, Julia Language v1.1.0 и JuMP. Чтобы начать локальную оптимизацию, я в настоящее время использую библиотеку CPLEX.jl, которая обеспечивает соединение (с использованием вызовов C на фоне) для локальной оптимизации некоторой модели. Назовем эту машину А.
Однако я пытаюсь запустить оптимизацию на удаленном компьютере, что означает, что когда я запускаю оптимизацию на A, Джулия вызовет CPLEX, установленный на компьютере B (в котором больше памяти, процессорных ресурсов и т. Д.).
Просматривая документацию CPLEX, я видел, что для локальной оптимизации мы вызываем функцию
CPXopenCPLEX(int * status_p)
предоставлено lib libcplex1290.so. Для удаленного подключения CPLEX предоставляет другой интерфейс для подключения к внешним серверам с помощью функции
CPXopenCPLEXremote(char const * transport, int argc, char const *const * argv, int * status_p)
Пакет CPLEX.jl поддерживает только локальную оптимизацию и использует функцию CPXopenCPLEX (). В поисках этого пакета соединение с локальной установкой CPLEX выполняется с помощью следующей команды:
ccall(("CPXopenCPLEX",libcplex),Ptr{Cvoid}, (Ptr{Cint},),stats)
где libcplex = "/ opt / ibm / ILOG / CPLEX_Studio129 / cplex / bin / x86-64_linux / libcplex1290.so", а статистика представляет собой массив {Int32,1}. Эта команда находится в файле cpx_env.jl пакета CPLEX.jl.
Я попытался реализовать аналогичную функцию, которая будет вызывать CPXopenCPLEX для удаления вместо CPXopenCPLEX правильных значений. Мой код Julia1.1 следующий:
const libcplex = "/opt/ibm/ILOG/CPLEX_Studio129/cplex/bin/x86-64_linux/libcplex1290remote.so"
argv=["/usr/bin/ssh", "IP_OF_REMOTE_MACHINE","/opt/ibm/ILOG/CPLEX_Studio129/cplex/bin/x86-64_linux/cplex", "-worker=process"]
ret= ccall(("CPXopenCPLEXremote",libcplex),Ptr{Cvoid}, (Ptr{Cchar},Cint,Ptr{Ptr{Cchar}},Ptr{Cint},),"processtransport",Int32(4),argv,stats)
Проблема в том, что ret = Ptr {Nothing} @ 0x0000000000000000 означает, что соединение не установлено.
Я совершенно уверен, что проблема в том, что я передаю аргументы ccall () для вызова CPXopenCPLEXremote.
Может ли кто-нибудь с опытом в этом виде звонка помочь мне с параметрами?
Я также настраиваю автоматическую идентификацию для соединения ssh. Сейчас я должен сообщать свой пользователь и пароль при каждом ssh-соединении с компьютера A на удаленный компьютер B. (Я обновлю этот вопрос позже)
Спасибо всем за любую помощь. Если это сработает, я собираюсь создать lib CPLEXremote.jl для сообщества.
С наилучшими пожеланиями, Исайя