跳到主要内容

C/C++部署

这里介绍了如何将生成的代码部署到C/C++环境中.

注意

包含生成的源码文件以及链接动态库或静态库即可调用生成代码. 调用生成代码时需注意:

  • 调用平台及编译器需与代码生成中的option.platform保持一致
  • 当调用的平台为Linux/Mac时, 需要链接math库 (-lm) , 以使用sin, cos, tan, sqrt等函数
  • 当调用平台为Windows时, 需要iphlpapi链接 (-liphlpapi) , 以获取mac地址

以vehicle为例, 假设platform'linux-x86_64-gcc', lib_type'static', 代码目录结构如下:

working_dir/
├── vehicle/
│ ├── vehicle_prob.c
│ ├── vehicle_prob.h
│ ├── vehicle_solver.h
│ ├── libvehicle_solver_static.a
├── vehicle_demo.cpp
.

编译与运行

使用CMake

以下为使用静态链接库编译一个demo (vehicle_demo.cpp) 的CMake片段:

CMakeLists.txt
# ${VEHICLE_CODEGEN_DIR} is the dir of the generated code
set(VEHICLE_CODEGEN_DIR ${CMAKE_CURRENT_SOURCE_DIR}/vehicle)
# ${LIBS} is the required libs (math or iphlpapi)
set(LIBS m)
add_executable(vehicle_demo vehicle_demo.cpp ${VEHICLE_CODEGEN_DIR}/vehicle_prob.c)
target_include_directories(vehicle_demo PRIVATE ${VEHICLE_CODEGEN_DIR})
target_link_libraries(vehicle_demo ${VEHICLE_CODEGEN_DIR}/libvehicle_solver_shared.a ${LIBS})

命令行

以下为使用g++编译的命令行示例:

g++ -o vehicle_demo vehicle_demo.cpp vehicle/vehicle_prob.c -I./vehicle -L./vehicle -lvehicle_solver_static -lm

完成编译后, 运行生成的可执行文件即可.

./vehicle_demo

多线程部署

当多个问题需要同时求解时, 可以使用多线程来加速求解.

注意

需要为每个线程分配独立的workspace与output, 否则会出现数据竞争.

以下为使用OpenMP并行求解的代码片段示例 (NUM_PROBS为问题数):

vehicle_demo.cpp
...
#pragma omp parallel for
for (int worker = 0; worker < NUM_PROBS; worker++) {
ws[worker].thread_id = worker;
vehicle_solve(&prob[worker], &option, &ws[worker], &output[worker]);
}
...

其中我们使用了thread_id来标识每个线程, 该值会被传入prob的函数入参中, 可以通过_solverinfo->thread_id来获取:

vehicle_prob.c
void vehicle_l(const Vehicle_SolverInfo *_solverinfo, ...)
{
...
int thread_id = _solverinfo->thread_id;
...
}
提示

该值不是必须的, 但在使用多线程时, 可以通过该值来区分不同的线程.

例如当优化问题的函数为用户自定义的external函数时, 可以通过该值来区分不同的线程, 以避免数据竞争.