并行编程

参考网站:

多进程模板

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()
posted @ 2021-05-05 17:53  半夜打老虎  阅读(198)  评论(0)    收藏  举报