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函数时, 可以通过该值来区分不同的线程, 以避免数据竞争.