并行编程
参考网站:
-
python
https://python-parallel-programmning-cookbook.readthedocs.io/zh_CN/latest/index.html
https://www.machinelearningplus.com/python/parallel-processing-python/ -
C++
http://www.cs.cmu.edu/afs/cs/academic/class/15210-s16/www/pasl.html
多进程模板
def show_predict_batch(predict_model_list, predict_path):
"""
批量处理预测模型
@predict_model_list: 预测的模型列表
@predict_path: 预测模型存放路径
return: None
"""
for i, predict_model in enumerate(tqdm(predict_model_list)):
try:
save_predict(predict_model, predict_path)
except KeyError:
print("predict_model: ", predict_model)
except Exception as e:
raise e
def parallel_show_predict(model_list, predict_path, n_workers=8):
"""
多进程处理
"""
if len(model_list) < n_workers:
n_workers = len(model_list)
chunk_len = len(model_list) // n_workers
chunk_lists = [model_list[i:i+chunk_len] for i in range(0, (n_workers-1)*chunk_len, chunk_len)]
chunk_lists.append(model_list[(n_workers - 1)*chunk_len:])
process_list = [Process(target=show_predict_batch, args=(chunk_list, predict_path, )) for chunk_list in chunk_lists]
for process in process_list:
process.start()
for process in process_list:
process.join()
ISPC
https://ispc.github.io/downloads.html
下载:https://github.com/ispc/ispc/releases
示例:https://blog.csdn.net/sandmangu/article/details/108706877
代码转汇编语言:https://godbolt.org/ https://ispc.godbolt.org/
if(WIN32)
set(ISPC_EXECUTABLE "${CMAKE_CURRENT_SOURCE_DIR}/bin/Win64/ispc.exe" CACHE INTERNAL "Ispc")
elseif(UNIX)
set(ISPC_EXECUTABLE "${CMAKE_CURRENT_SOURCE_DIR}/bin/Linux64/ispc" CACHE INTERNAL "Ispc")
endif()
function(target_add_ispc TARGET_NAME ISPC_SRC_PATH ISPC_SRC_NAME)
set(ISPC_FLAGS "-O3")
#set(ISPC_FLAGS "-g")
set(ISPC_TARGETS "sse2-i32x4,sse4-i32x8,avx1-i32x8,avx2-i32x16")
set(ISPC_ARCH "x86-64")
set(ISPC_KNOWN_TARGETS "sse2" "sse4" "avx1-" "avx2" "avx512knl" "avx512skx" "neon")
set(ISPC_HEADER_NAME "${CMAKE_CURRENT_BINARY_DIR}/${ISPC_SRC_NAME}_ispc.h")
set(ISPC_OBJ_NAME "${CMAKE_CURRENT_BINARY_DIR}/${ISPC_SRC_NAME}.ispc${CMAKE_CXX_OUTPUT_EXTENSION}")
set(ISPC_SRC_FULL_PATH "${ISPC_SRC_PATH}/${ISPC_SRC_NAME}.ispc")
if (UNIX)
list(APPEND ISPC_FLAGS --pic)
endif()
# Collect list of expected outputs
list(APPEND ISPC_BUILD_OUTPUT_OBJ ${ISPC_OBJ_NAME})
list(APPEND ISPC_BUILD_OUTPUT_HEADER ${ISPC_HEADER_NAME})
if ("${ISPC_ARCH}" MATCHES "x86")
string(FIND ${ISPC_TARGETS} "," MULTI_TARGET)
if (${MULTI_TARGET} GREATER -1)
foreach (ispc_target ${ISPC_KNOWN_TARGETS})
string(FIND ${ISPC_TARGETS} ${ispc_target} FOUND_TARGET)
if (${FOUND_TARGET} GREATER -1)
set(OUTPUT_TARGET ${ispc_target})
if (${ispc_target} STREQUAL "avx1-")
set(OUTPUT_TARGET "avx")
endif()
list(APPEND ISPC_BUILD_OUTPUT_HEADER "${CMAKE_CURRENT_BINARY_DIR}/${ISPC_SRC_NAME}_ispc_${OUTPUT_TARGET}.h")
list(APPEND ISPC_BUILD_OUTPUT_OBJ "${CMAKE_CURRENT_BINARY_DIR}/${ISPC_SRC_NAME}.ispc_${OUTPUT_TARGET}${CMAKE_CXX_OUTPUT_EXTENSION}")
endif()
endforeach()
endif()
elseif ("${ISPC_ARCH}" STREQUAL "arm" OR "${ISPC_ARCH}" STREQUAL "aarch64")
set(ISPC_TARGETS ${ISPC_ARM_TARGETS})
else()
message(FATAL_ERROR "Unknown architecture ${ISPC_ARCH}")
endif()
# ISPC command
add_custom_command(OUTPUT ${ISPC_BUILD_OUTPUT_OBJ} ${ISPC_BUILD_OUTPUT_HEADER}
COMMAND ${ISPC_EXECUTABLE} ${ISPC_SRC_FULL_PATH} ${ISPC_FLAGS} --target=${ISPC_TARGETS} --arch=${ISPC_ARCH}
-h ${ISPC_HEADER_NAME} -o ${ISPC_OBJ_NAME}
VERBATIM
DEPENDS ${ISPC_EXECUTABLE}
DEPENDS ${ISPC_SRC_FULL_PATH})
# To show ispc source in VS solution:
if(WIN32)
source_group("ISPC" FILES ${ISPC_SRC_FULL_PATH} ${ISPC_HEADER_NAME})
endif()
target_sources(${TARGET_NAME} PRIVATE ${ISPC_SRC_FULL_PATH} ${ISPC_HEADER_NAME} ${ISPC_BUILD_OUTPUT_OBJ})
target_include_directories(${TARGET_NAME} PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
endfunction()