diff --git a/.github/workflows/doc-generation.yml b/.github/workflows/doc-generation.yml index 87c77869517..949519995e6 100644 --- a/.github/workflows/doc-generation.yml +++ b/.github/workflows/doc-generation.yml @@ -30,7 +30,6 @@ jobs: -DUSE_MPI=ON \ -DBUILD_TESTING=ON \ -DUSE_OPENMP=ON \ - -DUSE_SMM=libxsmm \ -DMPI_EXECUTABLE_SUFFIX=.mpich \ .. diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index fc9f1b54946..8046c4d30d3 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -24,7 +24,6 @@ jobs: -DUSE_MPI=ON \ -DBUILD_TESTING=ON \ -DUSE_OPENMP=ON \ - -DUSE_SMM=libxsmm \ -DMPI_EXECUTABLE_SUFFIX=.mpich \ .. diff --git a/.github/workflows/testing-gcc.yml b/.github/workflows/testing-gcc.yml index 87585d2d5f3..7f4e916c182 100644 --- a/.github/workflows/testing-gcc.yml +++ b/.github/workflows/testing-gcc.yml @@ -27,7 +27,6 @@ jobs: -DBUILD_TESTING=ON \ -DUSE_MPI=OFF \ -DUSE_OPENMP=ON \ - -DUSE_SMM=blas \ -DUSE_MPI_F08=ON \ .. diff --git a/.github/workflows/testing-linux.yml b/.github/workflows/testing-linux.yml index 9efcbdb6ccd..5837342ecc1 100644 --- a/.github/workflows/testing-linux.yml +++ b/.github/workflows/testing-linux.yml @@ -33,7 +33,7 @@ jobs: matrix: use_mpi: [MPI=ON, MPI=OFF] use_openmp: [OPENMP=ON, OPENMP=OFF] - use_smm: [SMM=blas, SMM=libxsmm] + use_smm: [LIBXSMM=ON, LIBXSMM=OFF] mpi_suffix: [openmpi, mpich] exclude: - use_mpi: MPI=OFF @@ -82,7 +82,7 @@ jobs: - name: Upload coverage data (generated files) uses: actions/upload-artifact@v4 - if: matrix.use_mpi == 'MPI=ON' && matrix.use_openmp == 'OPENMP=ON' && matrix.use_smm == 'SMM=blas' && matrix.mpi_suffix == 'openmpi' + if: matrix.use_mpi == 'MPI=ON' && matrix.use_openmp == 'OPENMP=ON' && matrix.use_smm == 'LIBXSMM=OFF' && matrix.mpi_suffix == 'openmpi' with: name: coverage-data-${{ matrix.use_mpi }}-${{ matrix.use_openmp }}-${{ matrix.use_smm }}-${{ matrix.mpi_suffix }}-generated-files path: | @@ -137,7 +137,7 @@ jobs: strategy: matrix: use_openmp: [OPENMP=ON] - use_smm: [SMM=libxsmm] + use_smm: [LIBXSMM=ON] steps: - uses: actions/checkout@v4 diff --git a/CMakeLists.txt b/CMakeLists.txt index c80bd663158..ab5202783fd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -91,12 +91,6 @@ set(TEST_OMP_THREADS 2 CACHE STRING "Number of OpenMP threads for testing") -set(USE_SMM - "auto" - CACHE STRING - "Small Matrix Multiplication implementation to use (default: auto)") -set_property(CACHE USE_SMM PROPERTY STRINGS auto blas libxsmm) - set(USE_ACCEL "" CACHE STRING "Build with acceleration support (default: none)") @@ -149,44 +143,127 @@ if (USE_OPENMP) find_package(OpenMP REQUIRED) endif () -# =================================== LIBXSMM (rely on pkg-config) -if (USE_SMM MATCHES "libxsmm|auto") - if (USE_SMM MATCHES "libxsmm") - set(LIBXSMM_REQUIRED "REQUIRED") +# =================================== SMM (Small Matrix-Matrix multiplication) +# LIBXS provides host-side batched GEMM for all backends. LIBXSMM provides JIT +# kernels within LIBXS (optional, auto-detected). Set LIBXSROOT to use a +# prebuilt installation, or let FetchContent download it. Set USE_LIBXS=OFF to +# disable entirely. +include(FetchContent) +include(cmake/dependencies.cmake) +option(USE_LIBXS "Use LIBXS for host-side Small Matrix Multiplication" ON) +find_package(PkgConfig QUIET) +set(LIBXSROOT + "" + CACHE PATH "Root directory of a prebuilt LIBXS (skips FetchContent)") +if (USE_LIBXS) + # Try prebuilt: pkg-config > explicit root > path probing + if (NOT LIBXSROOT AND PkgConfig_FOUND) + pkg_check_modules(_LIBXS QUIET libxs) + if (_LIBXS_FOUND) + pkg_get_variable(LIBXSROOT libxs prefix) + endif () + endif () + if (NOT LIBXSROOT) + foreach (_dir "${CMAKE_SOURCE_DIR}/../libxs" "$ENV{HOME}/libxs" + "/opt/libxs") + if (EXISTS "${_dir}/include/libxs.f") + set(LIBXSROOT "${_dir}") + break() + endif () + endforeach () endif () - find_package(PkgConfig ${LIBXSMM_REQUIRED}) - if (USE_OPENMP) - if (BUILD_SHARED_LIBS OR USE_SMM MATCHES "libxsmm-shared") - pkg_check_modules(LIBXSMMEXT IMPORTED_TARGET GLOBAL libxsmmext-shared) + if (LIBXSROOT AND EXISTS "${LIBXSROOT}/include/libxs.f") + find_library( + LIBXS_LIBRARY + NAMES xs + PATHS "${LIBXSROOT}/lib" + NO_DEFAULT_PATH) + if (LIBXS_LIBRARY) + message(STATUS "Using prebuilt LIBXS from ${LIBXSROOT}") else () - pkg_check_modules(LIBXSMMEXT IMPORTED_TARGET GLOBAL libxsmmext-static) - endif () - if (NOT LIBXSMMEXT_FOUND) - pkg_check_modules(LIBXSMMEXT ${LIBXSMM_REQUIRED} IMPORTED_TARGET GLOBAL - libxsmmext) + message( + STATUS "LIBXS source found at ${LIBXSROOT} -- building as subdirectory") + set(LIBXS_FORTRAN + ON + CACHE BOOL "" FORCE) + set(LIBXS_SHARED + ${BUILD_SHARED_LIBS} + CACHE BOOL "" FORCE) + add_subdirectory("${LIBXSROOT}" "${CMAKE_BINARY_DIR}/_deps/libxs-build") + set(LIBXS_FETCHED TRUE) endif () - endif () - if (BUILD_SHARED_LIBS OR USE_SMM MATCHES "libxsmm-shared") - pkg_check_modules(LIBXSMM IMPORTED_TARGET GLOBAL libxsmmf-shared) else () - pkg_check_modules(LIBXSMM IMPORTED_TARGET GLOBAL libxsmmf-static) - endif () - if (NOT LIBXSMM_FOUND) - pkg_check_modules(LIBXSMM ${LIBXSMM_REQUIRED} IMPORTED_TARGET GLOBAL - libxsmmf) + message(STATUS "LIBXS not found locally -- downloading via FetchContent") + FetchContent_Declare( + libxs + GIT_REPOSITORY ${LIBXS_GIT_REPOSITORY} + GIT_TAG ${LIBXS_GIT_TAG}) + set(LIBXS_FORTRAN + ON + CACHE BOOL "" FORCE) + set(LIBXS_SHARED + ${BUILD_SHARED_LIBS} + CACHE BOOL "" FORCE) + FetchContent_MakeAvailable(libxs) + set(LIBXS_FETCHED TRUE) + set(LIBXSROOT "${libxs_SOURCE_DIR}") endif () -endif () - -# =================================== SMM (Small Matrix-Matrix multiplication) -if (USE_SMM MATCHES "blas" OR (USE_SMM MATCHES "auto" AND NOT LIBXSMM_FOUND)) - if (USE_ACCEL MATCHES "opencl") - message(FATAL_ERROR "OpenCL requires USE_SMM=libxsmm") + # Optional LIBXSMM for JIT-compiled GEMM kernels + option(USE_LIBXSMM "Use LIBXSMM for JIT-compiled GEMM kernels" ON) + if (USE_LIBXSMM) + set(LIBXSMMROOT + "" + CACHE PATH "Root directory of LIBXSMM (optional)") + if (NOT LIBXSMMROOT) + foreach (_dir "${LIBXSROOT}/../libxsmm" "$ENV{HOME}/libxsmm") + if (EXISTS "${_dir}/include/libxsmm.h") + set(LIBXSMMROOT "${_dir}") + break() + endif () + endforeach () + endif () + if (LIBXSMMROOT AND EXISTS "${LIBXSMMROOT}/include/libxsmm.h") + find_library( + LIBXSMM_LIBRARY + NAMES xsmm + PATHS "${LIBXSMMROOT}/lib" + NO_DEFAULT_PATH) + if (LIBXSMM_LIBRARY) + message(STATUS "Using prebuilt LIBXSMM from ${LIBXSMMROOT}") + else () + message( + STATUS + "LIBXSMM source found at ${LIBXSMMROOT} -- building as subdirectory" + ) + set(XSMM_STATIC + ON + CACHE BOOL "" FORCE) + add_subdirectory("${LIBXSMMROOT}" + "${CMAKE_BINARY_DIR}/_deps/libxsmm-build") + set(LIBXSMM_FETCHED TRUE) + get_target_property(_xsmm_srcs xsmm SOURCES) + list(FILTER _xsmm_srcs EXCLUDE REGEX "binaryexport_generator") + set_target_properties(xsmm PROPERTIES SOURCES "${_xsmm_srcs}") + endif () + else () + message( + STATUS "LIBXSMM not found locally -- downloading via FetchContent") + FetchContent_Declare( + libxsmm + GIT_REPOSITORY "https://github.com/libxsmm/libxsmm.git" + GIT_TAG ${LIBXSMM_GIT_TAG}) + set(XSMM_STATIC + ON + CACHE BOOL "" FORCE) + FetchContent_MakeAvailable(libxsmm) + set(LIBXSMMROOT "${libxsmm_SOURCE_DIR}") + set(LIBXSMM_FETCHED TRUE) + get_target_property(_xsmm_srcs xsmm SOURCES) + list(FILTER _xsmm_srcs EXCLUDE REGEX + "(binaryexport_generator|gemm_driver)") + set_target_properties(xsmm PROPERTIES SOURCES "${_xsmm_srcs}") + endif () endif () - message(STATUS "Using BLAS for Small Matrix Multiplication") -elseif (USE_SMM MATCHES "libxsmm" OR USE_SMM MATCHES "auto") - message(STATUS "Using libxsmm for Small Matrix Multiplication") -else () - message(FATAL_ERROR "Unknown SMM library specified") endif () # =================================== BLAS & LAPACK, PkgConfig @@ -251,13 +328,81 @@ if (NOT USE_ACCEL MATCHES "none") endif () if (USE_ACCEL MATCHES "opencl") + # Hint additional OpenCL locations (Intel oneAPI, CUDA toolkit) + if (DEFINED ENV{CMPLR_ROOT}) + list(APPEND CMAKE_PREFIX_PATH "$ENV{CMPLR_ROOT}") + endif () + if (DEFINED ENV{CUDA_PATH}) + list(APPEND CMAKE_PREFIX_PATH "$ENV{CUDA_PATH}") + endif () find_package(OpenCL REQUIRED) - - set(DBCSR_OPENCL_SCRIPT ${DBCSR_SOURCE_DIR}/acc/opencl/acc_opencl.sh) - set(DBCSR_OPENCL_COMMON acc/opencl/common/opencl_atomics.h - acc/opencl/common/opencl_common.h) - list(APPEND DBCSR_ACC_HEADER acc/opencl/smm/opencl_libsmm.h - acc/opencl/acc_opencl.h) + # LIBXS is required for the OpenCL backend + if (NOT LIBXS_LIBRARY AND NOT LIBXS_FETCHED) + message( + FATAL_ERROR + "LIBXS not found. OpenCL backend requires LIBXS (USE_LIBXS=ON).") + endif () + # Locate LIBXSTREAM: prebuilt > pkg-config > path probing > FetchContent + set(LIBXSTREAMROOT + "" + CACHE PATH "Root directory of a prebuilt LIBXSTREAM (skips FetchContent)") + if (NOT LIBXSTREAMROOT AND PkgConfig_FOUND) + pkg_check_modules(_LIBXSTREAM QUIET libxstream) + if (_LIBXSTREAM_FOUND) + pkg_get_variable(LIBXSTREAMROOT libxstream prefix) + endif () + endif () + if (NOT LIBXSTREAMROOT) + foreach (_dir "${CMAKE_SOURCE_DIR}/../libxstream" "$ENV{HOME}/libxstream" + "/opt/libxstream") + if (EXISTS "${_dir}/include/libxstream.h") + set(LIBXSTREAMROOT "${_dir}") + break() + endif () + endforeach () + endif () + if (LIBXSTREAMROOT AND EXISTS "${LIBXSTREAMROOT}/include/libxstream.h") + find_library( + LIBXSTREAM_LIBRARY xstream + PATHS "${LIBXSTREAMROOT}/lib" + NO_DEFAULT_PATH) + if (LIBXSTREAM_LIBRARY) + message(STATUS "Using prebuilt LIBXSTREAM from ${LIBXSTREAMROOT}") + else () + message( + STATUS + "LIBXSTREAM source found at ${LIBXSTREAMROOT} -- building as subdirectory" + ) + set(LIBXSROOT + "${LIBXSROOT}" + CACHE PATH "" FORCE) + set(LIBXSTREAM_SHARED + ${BUILD_SHARED_LIBS} + CACHE BOOL "" FORCE) + add_subdirectory("${LIBXSTREAMROOT}" + "${CMAKE_BINARY_DIR}/_deps/libxstream-build") + set(LIBXSTREAM_FETCHED TRUE) + endif () + else () + message( + STATUS "LIBXSTREAM not found locally -- downloading via FetchContent") + FetchContent_Declare( + libxstream + GIT_REPOSITORY ${LIBXSTREAM_GIT_REPOSITORY} + GIT_TAG ${LIBXSTREAM_GIT_TAG}) + set(LIBXSROOT + "${LIBXSROOT}" + CACHE PATH "" FORCE) + set(LIBXSTREAM_SHARED + ${BUILD_SHARED_LIBS} + CACHE BOOL "" FORCE) + FetchContent_MakeAvailable(libxstream) + set(LIBXSTREAMROOT "${libxstream_SOURCE_DIR}") + set(LIBXSTREAM_FETCHED TRUE) + endif () + message(STATUS "Using LIBXSTREAM from ${LIBXSTREAMROOT}") + # Kernel build script and common OpenCL headers + set(DBCSR_OPENCL_SCRIPT "${LIBXSTREAMROOT}/scripts/tool_opencl.sh") endif () if (USE_ACCEL MATCHES "cuda|hip") diff --git a/cmake/CompilerConfiguration.cmake b/cmake/CompilerConfiguration.cmake index e0cace547fb..60e4a55eebb 100644 --- a/cmake/CompilerConfiguration.cmake +++ b/cmake/CompilerConfiguration.cmake @@ -8,14 +8,15 @@ if (CMAKE_Fortran_COMPILER_ID STREQUAL "GNU") if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 13) # comparison against CXX version rather than GFortran version set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -Wno-error=uninitialized") # false positive (allocatable array) endif () + set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -Wno-function-elimination") include(CheckFortranCompilerFlag) - check_fortran_compiler_flag("-Wno-error=deprecated-openmp" _fc_has_deprecated_openmp) + check_fortran_compiler_flag("-Wdeprecated-openmp" _fc_has_deprecated_openmp) if (_fc_has_deprecated_openmp) - set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -Wno-error=deprecated-openmp") + set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -Wno-deprecated-openmp") endif () set(CMAKE_Fortran_FLAGS_RELEASE "-O3 -g -funroll-loops") set(CMAKE_Fortran_FLAGS_COVERAGE "-O0 -g --coverage -fno-omit-frame-pointer -fcheck=all,no-array-temps -ffpe-trap=invalid,zero,overflow -fbacktrace -finit-real=snan -finit-integer=-42 -finit-derived -Werror=realloc-lhs -finline-matmul-limit=0 -Werror") - set(CMAKE_Fortran_FLAGS_DEBUG "-O2 -ggdb -fno-omit-frame-pointer -fcheck=all -ffpe-trap=invalid,zero,overflow -fbacktrace -finit-real=snan -finit-integer=-42 -finit-derived -finline-matmul-limit=0 -fsanitize=undefined -fsanitize=address -fsanitize-recover=all -Wall -Wextra -Werror -Werror=realloc-lhs -Wno-error=array-temporaries -Wno-error=compare-reals -Wno-error=function-elimination -Wno-error=surprising") + set(CMAKE_Fortran_FLAGS_DEBUG "-O2 -ggdb -fno-omit-frame-pointer -fcheck=all -ffpe-trap=invalid,zero,overflow -fbacktrace -finit-real=snan -finit-integer=-42 -finit-derived -finline-matmul-limit=0 -fsanitize=undefined -fsanitize=address -fsanitize-recover=all -Wall -Wextra -Werror -Werror=realloc-lhs -Wno-error=array-temporaries -Wno-error=compare-reals -Wno-error=surprising") if ((NOT (USE_MPI)) OR (NOT ("${MPI_Fortran_LIBRARY_VERSION_STRING}" MATCHES "Open MPI"))) set(CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_DEBUG} -fsanitize=leak") endif () diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake new file mode 100644 index 00000000000..b4dea09cf88 --- /dev/null +++ b/cmake/dependencies.cmake @@ -0,0 +1,7 @@ +set(LIBXS_GIT_REPOSITORY "https://github.com/hfp/libxs.git") +set(LIBXS_GIT_TAG "1d776c091fb41d4aa7bc92335f6387878e1a9db6") + +set(LIBXSTREAM_GIT_REPOSITORY "https://github.com/hfp/libxstream.git") +set(LIBXSTREAM_GIT_TAG "87bbd69f0cdf6ca23801923ee201f960fb37860f") + +set(LIBXSMM_GIT_TAG "0cea22fdc34ec54bc59ffb47a43cb3e28b26d3e0") diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index fdf470cd52a..f96a0b61d22 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -136,10 +136,11 @@ elseif (USE_ACCEL MATCHES "cuda") PROPERTIES COMPILE_FLAGS "--x cu") endif () +# OpenCL backend: SMM from LIBXSTREAM samples, ACC from LIBXSTREAM library +set(DBCSR_SMM_DIR "${LIBXSTREAMROOT}/samples/smm") set(DBCSR_OPENCL_SRCS - acc/opencl/smm/opencl_libsmm.c acc/opencl/acc_opencl.c - acc/opencl/acc_opencl_event.c acc/opencl/acc_opencl_mem.c - acc/opencl/acc_opencl_stream.c) + "${DBCSR_SMM_DIR}/smm_acc.c" "${DBCSR_SMM_DIR}/smm_trans.c" + "${DBCSR_SMM_DIR}/smm_params.c" "${DBCSR_SMM_DIR}/smm_kernel.c") # set the __SHORT_FILE__ per file for dbcsr sources foreach (dbcsr_src ${DBCSR_FORTRAN_SRCS}) @@ -185,20 +186,36 @@ elseif (USE_ACCEL MATCHES "cuda") "${ACC_ARCH_NUMBER}") endif () -if (USE_SMM MATCHES "libxsmm" OR (USE_SMM MATCHES "auto" AND LIBXSMM_FOUND)) - target_compile_definitions(dbcsr PRIVATE __LIBXSMM) - target_link_directories(dbcsr PUBLIC ${LIBXSMM_LIBRARY_DIRS}) - if (USE_OPENMP) - target_link_libraries(dbcsr PRIVATE PkgConfig::LIBXSMMEXT) - endif () - target_link_libraries(dbcsr PRIVATE PkgConfig::LIBXSMM) - target_link_libraries(dbcsr PRIVATE ${BLAS_LIBRARIES}) +if (LIBXS_FETCHED) + target_compile_definitions(dbcsr PRIVATE __LIBXS) + target_link_libraries(dbcsr PRIVATE libxs::libxs ${BLAS_LIBRARIES}) +elseif (LIBXS_LIBRARY) + target_compile_definitions(dbcsr PRIVATE __LIBXS) + target_include_directories(dbcsr PRIVATE "${LIBXSROOT}/include") + target_link_libraries(dbcsr PRIVATE ${LIBXS_LIBRARY} ${BLAS_LIBRARIES}) endif () if (BLAS_LIBRARIES MATCHES "mkl_") target_compile_definitions(dbcsr PRIVATE __MKL) endif () +if (LIBXSMM_FETCHED) + target_compile_definitions(dbcsr PRIVATE __LIBXSMM) + target_include_directories(dbcsr PRIVATE "${LIBXSMMROOT}/include") + set_target_properties( + xsmm PROPERTIES INTERFACE_INCLUDE_DIRECTORIES + "$") + install( + TARGETS xsmm + EXPORT DBCSRTargets + ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}") + target_link_libraries(dbcsr PRIVATE xsmm) +elseif (LIBXSMM_LIBRARY) + target_compile_definitions(dbcsr PRIVATE __LIBXSMM) + target_include_directories(dbcsr PRIVATE "${LIBXSMMROOT}/include") + target_link_libraries(dbcsr PRIVATE ${LIBXSMM_LIBRARY}) +endif () + if (APPLE) # fix /proc/self/statm can not be opened on macOS target_compile_definitions(dbcsr PRIVATE __NO_STATM_ACCESS) @@ -264,9 +281,7 @@ if (USE_ACCEL MATCHES "cuda|hip") add_subdirectory(acc/libsmm_acc) endif () -if (USE_ACCEL MATCHES "opencl") - add_subdirectory(acc/opencl/smm) -endif () +# OpenCL SMM is provided by LIBXSTREAM (no local subdirectory) if (USE_ACCEL) target_compile_definitions( @@ -280,6 +295,41 @@ if (USE_ACCEL) $<$:__CUDA_PROFILING> $<$:__HIP_PROFILING>) + if (USE_ACCEL MATCHES "opencl") + target_compile_definitions(dbcsr PRIVATE __LIBXSTREAM) + target_include_directories(dbcsr PRIVATE "${LIBXSTREAMROOT}/include" + "${DBCSR_SMM_DIR}") + if (NOT LIBXS_FETCHED) + target_include_directories(dbcsr PRIVATE "${LIBXSROOT}/include") + endif () + if (LIBXSTREAM_FETCHED) + set(LIBXSTREAM_LINK libxstream::libxstream) + else () + find_library( + LIBXSTREAM_LIBRARY xstream + PATHS "${LIBXSTREAMROOT}/lib" + NO_DEFAULT_PATH) + if (NOT LIBXSTREAM_LIBRARY) + message( + FATAL_ERROR "libxstream library not found in ${LIBXSTREAMROOT}/lib") + endif () + set(LIBXSTREAM_LINK ${LIBXSTREAM_LIBRARY}) + endif () + # Generate smm_kernels.h from .cl kernel sources + set(DBCSR_SMM_KERNELS "${DBCSR_SMM_DIR}/kernels/multiply.cl" + "${DBCSR_SMM_DIR}/kernels/transpose.cl") + file(GLOB DBCSR_SMM_PARAMS "${DBCSR_SMM_DIR}/params/tune_multiply_*.csv") + set(DBCSR_SMM_GENHDR "${DBCSR_SMM_DIR}/smm_kernels.h") + add_custom_command( + OUTPUT "${DBCSR_SMM_GENHDR}" + COMMAND "${DBCSR_OPENCL_SCRIPT}" -I "${LIBXSTREAMROOT}/include" + ${DBCSR_SMM_KERNELS} ${DBCSR_SMM_PARAMS} "${DBCSR_SMM_GENHDR}" + DEPENDS "${DBCSR_OPENCL_SCRIPT}" ${DBCSR_SMM_KERNELS} ${DBCSR_SMM_PARAMS} + COMMENT "Generating OpenCL SMM kernel header") + add_custom_target(dbcsr_smm_kernels DEPENDS "${DBCSR_SMM_GENHDR}") + add_dependencies(dbcsr dbcsr_smm_kernels) + endif () + target_link_libraries( dbcsr PRIVATE $<$:CUDA::cudart> @@ -292,7 +342,8 @@ if (USE_ACCEL) $<$:hip::host> $<$:roctx64> $<$:roctracer64> - $<$:OpenCL::OpenCL>) + $<$:OpenCL::OpenCL> + $<$:${LIBXSTREAM_LINK}>) endif () # ================================================================================================= @@ -364,12 +415,6 @@ if (USE_ACCEL MATCHES "opencl") cmake_path(GET FILE PARENT_PATH SUBDIR) install(FILES "${FILE}" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${SUBDIR}") endforeach () - install(PROGRAMS "${DBCSR_OPENCL_SCRIPT}" - DESTINATION "${CMAKE_INSTALL_DATADIR}/opencl") - foreach (FILE ${DBCSR_OPENCL_COMMON}) - cmake_path(GET FILE PARENT_PATH SUBDIR) - install(FILES "${FILE}" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${SUBDIR}") - endforeach () endif () configure_package_config_file( diff --git a/src/acc/acc.h b/src/acc/acc.h index 239b02fa8e6..1385b905208 100644 --- a/src/acc/acc.h +++ b/src/acc/acc.h @@ -9,8 +9,6 @@ #ifndef DBCSR_ACC_H #define DBCSR_ACC_H -#include - #define DBCSR_STRINGIFY_AUX(SYMBOL) #SYMBOL #define DBCSR_STRINGIFY(SYMBOL) DBCSR_STRINGIFY_AUX(SYMBOL) #define DBCSR_CONCATENATE2(A, B) A##B @@ -19,9 +17,15 @@ /** used to mark variables used */ #define DBCSR_MARK_USED(x) (void)(x) -#if defined(__cplusplus) +#if defined(__OPENCL) +/* ACC interface provided by LIBXSTREAM */ +# include +#else +# include + +# if defined(__cplusplus) extern "C" { -#endif +# endif /** types */ typedef int c_dbcsr_acc_bool_t; @@ -29,6 +33,8 @@ typedef int c_dbcsr_acc_bool_t; /** initialization and finalization */ int c_dbcsr_acc_init(void); int c_dbcsr_acc_finalize(void); + +/** error handling */ void c_dbcsr_acc_clear_errors(void); /** devices */ @@ -67,8 +73,9 @@ int c_dbcsr_acc_dev_mem_info(size_t* mem_free, size_t* mem_total); void c_dbcsr_timeset(const char** routineN, const int* routineN_len, int* handle); void c_dbcsr_timestop(const int* handle); -#if defined(__cplusplus) +# if defined(__cplusplus) } -#endif +# endif +#endif /*defined(__OPENCL)*/ #endif /*DBCSR_ACC_H*/ diff --git a/src/acc/acc_bench.c b/src/acc/acc_bench.c index f443a29ee39..ce61ae49b5a 100644 --- a/src/acc/acc_bench.c +++ b/src/acc/acc_bench.c @@ -4,62 +4,39 @@ /* */ /* For information on the license, see the LICENSE file. */ /* For further information please visit https://dbcsr.cp2k.org */ -/* SPDX-License-Identifier: GPL-2.0+ */ +/* SPDX-License-Identifier: BSD-3-Clause */ /*------------------------------------------------------------------------------------------------*/ #include "acc_libsmm.h" #include "acc_bench.h" -#include -#include -#include -#if defined(__LIBXSMM) -# if defined(LIBXSMM_DEFAULT_CONFIG) -# include -# else -# include -# if !defined(LIBXSMM_TIMER_H) -# include -# endif -# if !defined(LIBXSMM_SYNC_H) -# include -# endif -# endif -# if defined(LIBXSMM_VERSION_NUMBER) && LIBXSMM_VERSION4(1, 17, 0, 0) < LIBXSMM_VERSION_NUMBER -# define USE_LIBXSMM -# endif +#if defined(__LIBXS) +# include +# include +# include +# include +#else /* code depends on LIBXS */ +# include +# define __LIBXS #endif -#if defined(USE_LIBXSMM) -# if defined(_OPENMP) -# define ACC_BENCH_USEOMP(FUNC) LIBXSMM_USEOMP(FUNC) -# else -# define ACC_BENCH_USEOMP(FUNC) (FUNC) -# endif -# define ACC_BENCH_GEMM_BATCH(IPREC, OPREC, TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, STRIDE_A, B, LDB, STRIDE_B, BETA, C, LDC, \ - STRIDE_C, INDEX_STRIDE, INDEX_BASE, BATCHSIZE) \ - ACC_BENCH_USEOMP(libxsmm_gemm_batch) \ - (IPREC, OPREC, TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, STRIDE_A, B, LDB, STRIDE_B, BETA, C, LDC, STRIDE_C, INDEX_STRIDE, \ - INDEX_BASE, BATCHSIZE) -# define PRINTF(...) \ - do { \ - const size_t print_buffer_size = sizeof(print_buffer) - print_offset; \ - const int print_buffer_result = LIBXSMM_SNPRINTF(print_buffer + print_offset, print_buffer_size, __VA_ARGS__); \ - assert(0 <= print_buffer_result && print_buffer_result < (int)print_buffer_size); \ - print_offset += print_buffer_result; \ - } while (0) -#else -# define PRINTF(...) printf(__VA_ARGS__) +#if defined(_OPENMP) +# include #endif -#if !defined(DEDUPLICATE) && 0 -# define DEDUPLICATE +#define PRINTF(...) \ + do { \ + const size_t print_buffer_size = sizeof(print_buffer) - print_offset; \ + const int print_buffer_result = LIBXS_SNPRINTF(print_buffer + print_offset, print_buffer_size, __VA_ARGS__); \ + assert(0 <= print_buffer_result && print_buffer_result < (int)print_buffer_size); \ + print_offset += print_buffer_result; \ + } while (0) + +#if !defined(ALIGNMENT) +# define ALIGNMENT LIBXS_ALIGNMENT #endif #if !defined(ELEM_TYPE) # define ELEM_TYPE double #endif -#if !defined(ALIGNMENT) -# define ALIGNMENT 64 -#endif #if !defined(BATCHGRAIN) # define BATCHGRAIN 100 #endif @@ -69,18 +46,15 @@ #if !defined(NRAND) # define NRAND BATCHSIZE #endif +#if !defined(DEDUPLICATE) && 0 +# define DEDUPLICATE +#endif #if !defined(NREPEAT) # define NREPEAT 3 #endif #if !defined(XREPEAT) # define XREPEAT 66 #endif -#if !defined(TRANSPOSE) -# define TRANSPOSE -#endif -#if !defined(VALIDATE) -# define VALIDATE -#endif #if !defined(WARMUP) # define WARMUP 2 #endif @@ -92,7 +66,6 @@ #define ACC_BENCH_SMM_EPSILON_double 1E-3 #define ACC_BENCH_SMM_EPSILON_float 2E-3 -#define ROUNDUP2(N, NPOT) ((((unsigned long long)N) + ((NPOT) - 1)) & ~((NPOT) - 1)) #define CHECK(EXPR, RPTR, VALUE) \ do { \ if (NULL != ((const void*)(RPTR))) { \ @@ -100,6 +73,9 @@ const int check_r_ = (EXPR); \ if (0 != check_r_) { \ *((int*)(RPTR)) = check_r_; \ + if (!(0 > check_r_ && 0 == (VALUE))) { \ + fprintf(stderr, "ERROR ACC/BENCH: %s failed (code=%i)\n", #EXPR, check_r_); \ + } \ assert(0 > check_r_ && 0 == (VALUE)); \ } \ } \ @@ -111,95 +87,9 @@ static void parse_params(int argc, char* argv[], FILE** file, const char** snr, const char** sss, const char** ssm, - const char** ssn, const char** ssk, const char** snc, const char** sna, const char** snb) { - char buffer[1024], *args[8]; - int i; - assert(file && snr && sss && ssm && ssn && ssk && snc && sna && snb); - --argc; - if (NULL == *file) *file = (1 <= argc ? fopen(argv[1], "r") : NULL); - if (NULL == *file) { - for (i = 0; i < argc; ++i) args[i] = argv[i + 1]; - } - else { /* input file is specified */ - argc = 0; - if (NULL != fgets(buffer, sizeof(buffer), *file)) { - char* arg = strtok(buffer, DELIMS); - while (NULL == arg && NULL != fgets(buffer, sizeof(buffer), *file)) { - arg = strtok(buffer, DELIMS); - } - for (; NULL != arg; arg = strtok(NULL, DELIMS)) { - if (argc * sizeof(*args) < sizeof(args)) args[argc++] = arg; - else { /* malformed command-line */ - fclose(*file); - *file = NULL; - break; - } - } - } - else { - fclose(*file); - *file = NULL; - } - } - i = 0; - if (i < argc) { - const char* x1 = strchr(args[i], 'x'); - const char* x2 = (NULL == x1 ? NULL : strchr(x1 + 1, 'x')); - if (NULL == x1 || NULL == x2) { /* accept "M N K" */ - *snr = args[i++]; - *sss = (i < argc ? args[i++] : NULL); - if (i < argc) { - x1 = strchr(args[i], 'x'); - x2 = (NULL == x1 ? NULL : strchr(x1 + 1, 'x')); - *ssm = args[i++]; - if (NULL == x1 || NULL == x2) { /* accept "M N K" */ - *ssn = (i < argc ? args[i++] : NULL); - *ssk = (i < argc ? args[i++] : NULL); - } - else { /* accept "MxNxK" */ - *ssn = x1 + 1; - *ssk = x2 + 1; - } - } - } - else { /* accept "MxNxK" */ - *ssm = args[i++]; - *ssn = x1 + 1; - *ssk = x2 + 1; - } - } - *snc = (i < argc ? args[i++] : NULL); - *sna = (i < argc ? args[i++] : NULL); - *snb = (i < argc ? args[i++] : NULL); -} - + const char** ssn, const char** ssk, const char** snc, const char** sna, const char** snb); -static size_t parse_nbytes(const char* nbytes, size_t* nelems) { - size_t result = 0; - if (NULL != nelems) *nelems = 0; - if (NULL != nbytes && '\0' != *nbytes) { - size_t u = strlen(nbytes) - 1; - const char units[] = "kmgKMG", *const unit = strchr(units, nbytes[u]); - char* end = NULL; - /* take parsed value with increased type-width */ - const long long int ibytes = strtol(nbytes, &end, 10); - if (NULL != end) { /* no obvious error */ - /* value is given without unit */ - if (NULL == unit && '\0' == *end) { - result = (size_t)ibytes; - if (NULL != nelems) *nelems = result; - } - /* must match allowed set of units */ - else if (NULL != unit && *unit == *end) { - result = (size_t)ibytes; - if (NULL != nelems) *nelems = result; - u = (unit - units) % 3 + 1; - result <<= u * 10; - } - } - } - return result; -} +static size_t parse_nbytes(const char* nbytes, size_t* nelems); int main(int argc, char* argv[]) { @@ -219,35 +109,25 @@ int main(int argc, char* argv[]) { const char* const env_nrepeat_h2d = getenv("NREPEAT_H2D"); const int nrepeat_h2d = (NULL == env_nrepeat_h2d ? 1 : MAX(atoi(env_nrepeat_h2d), 1)); #endif -#if defined(USE_LIBXSMM) - double perf_h2d = 0, perf_dev = 0, perf_hst = 0; + double maxdiff = 0, perf_h2d = 0, perf_dev = 0, perf_hst = 0; const char* const env_check_h2d = getenv("CHECK_H2D"); const char* const env_check_dev = getenv("CHECK_DEV"); const char* const env_check_hst = getenv("CHECK_HST"); -# if defined(__OPENCL) +#if defined(__OPENCL) const char* const env_nrepeat_smm = getenv("NREPEAT_SMM"); const int nrepeat_smm = (NULL == env_nrepeat_smm ? 1 : MAX(atoi(env_nrepeat_smm), 1)); -# else - const int nrepeat_smm = 1; -# endif -# if defined(VALIDATE) - double maxdiff = 0; -# else - DBCSR_MARK_USED(check); -# endif #else - DBCSR_MARK_USED(check); + const int nrepeat_smm = 1; #endif - CHECK(libsmm_acc_init(), &result, check); /* note: libsmm_acc_init() may imply acc_init() */ + CHECK(libsmm_acc_init(), &result, check); if (EXIT_SUCCESS == result) { int ndevices = 0; result = c_dbcsr_acc_get_ndevices(&ndevices); if (EXIT_SUCCESS == result && 0 < ndevices) { const char* const env_device = getenv("DEVICE"); - const char* const env_rank = (NULL != getenv("PMI_RANK") ? getenv("PMI_RANK") : getenv("OMPI_COMM_WORLD_LOCAL_RANK")); - const int rank = (NULL != env_rank ? atoi(env_rank) : -1); + const int nranks = libxs_nranks(), nrank = libxs_nrank(); int device = ((NULL == env_device || '\0' == *env_device) ? 0 : atoi(env_device)); - device = ((0 <= device && device < ndevices) ? (0 <= rank ? (rank % ndevices) : device) : -1); + device = ((0 <= device && device < ndevices) ? (1 < nranks ? (nrank % ndevices) : device) : -1); result = c_dbcsr_acc_set_active_device(device); if (EXIT_SUCCESS == result) { printf("Activated device%i (ndevices=%i)\n", device, ndevices); @@ -263,7 +143,7 @@ int main(int argc, char* argv[]) { if (EXIT_SUCCESS == result) { rnd = (int*)malloc(sizeof(int) * NRAND); if (NULL != rnd) { - srand(25071975); /* seed rng */ + srand(25071975); for (i = 0; i < NRAND; ++i) rnd[i] = rand(); parse_params(argc, argv, &file, &snr, &sss, &ssm, &ssn, &ssk, &snc, &sna, &snb); } @@ -287,8 +167,8 @@ int main(int argc, char* argv[]) { k = (0 < isk ? isk : m); { #if defined(ALIGNMENT) && (0 < ALIGNMENT) - const int ma = (int)ROUNDUP2(sizeof(ELEM_TYPE) * m, ALIGNMENT); - const int ka = (int)ROUNDUP2(sizeof(ELEM_TYPE) * k, ALIGNMENT); + const int ma = (int)LIBXS_UP2(sizeof(ELEM_TYPE) * m, ALIGNMENT); + const int ka = (int)LIBXS_UP2(sizeof(ELEM_TYPE) * k, ALIGNMENT); const int mn = ma * n / (int)sizeof(ELEM_TYPE); const int mk = ma * k / (int)sizeof(ELEM_TYPE); const int kn = ka * n / (int)sizeof(ELEM_TYPE); @@ -300,15 +180,10 @@ int main(int argc, char* argv[]) { ELEM_TYPE *amat_hst = NULL, *bmat_hst = NULL, *cmat_hst = NULL; ELEM_TYPE *amat_dev = NULL, *bmat_dev = NULL, *cmat_dev = NULL; void* stream = NULL; -#if defined(USE_LIBXSMM) - libxsmm_timer_tickint start; + libxs_timer_tick_t start; int print_offset = 0; char print_buffer[1024] = ""; -# if defined(TRANSPOSE) && defined(VALIDATE) - double transpose = 0; -# endif - double duration = 0; -#endif + double transpose = 0, duration = 0; const char* const env_batchsize_smm = getenv("BATCHSIZE_SMM"); const int xrepeat = (0 != check ? NREPEAT : XREPEAT); int nrepeat = (0 < inr ? inr : xrepeat); @@ -341,10 +216,10 @@ int main(int argc, char* argv[]) { } if (0 >= stack_size) { /* trigger default */ if (0 > stack_size) { /* randomize batchsize */ - const int r = rnd[nok % NRAND], ss = -stack_size, bs = (1 < ss ? ss : BATCHSIZE); - const int limit = (BATCHGRAIN < ss ? ((bs + BATCHGRAIN - 1) / BATCHGRAIN) : ss); - stack_size = (r % limit + 1) * BATCHGRAIN; - nrepeat = MAX((BATCHSIZE * nrepeat + stack_size - 1) / stack_size, xrepeat); + const int rr = rnd[nok % NRAND], ss = -stack_size, bs = (1 < ss ? ss : BATCHSIZE); + const int limit = (BATCHGRAIN < ss ? LIBXS_UPDIV(bs, BATCHGRAIN) : ss); + stack_size = (rr % limit + 1) * BATCHGRAIN; + nrepeat = MAX(LIBXS_UPDIV(BATCHSIZE * nrepeat, stack_size), xrepeat); } else stack_size = BATCHSIZE; /* plain default */ } @@ -370,7 +245,7 @@ int main(int argc, char* argv[]) { CHECK(c_dbcsr_acc_host_mem_allocate((void**)(void*)&trans_hst, sizeof(int) * nb, stream), &result, check); CHECK(c_dbcsr_acc_stream_sync(stream), &result, check); /* ensure host-data is allocated */ if (NULL != amat_hst && NULL != bmat_hst && NULL != trans_hst && NULL != stack_hst) { - init_stack(stack_hst, stack_size, NRAND, rnd, mn, mk, kn, nc, na, nb); + INIT_STACK(stack_hst, stack_size, NRAND, rnd, mn, mk, kn, nc, na, nb); #if defined(_OPENMP) # pragma omp parallel #endif @@ -396,33 +271,27 @@ int main(int argc, char* argv[]) { CHECK(c_dbcsr_acc_dev_mem_allocate((void**)(void*)&trans_dev, sizeof(int) * nb), &result, check); CHECK(c_dbcsr_acc_memset_zero(cmat_dev, 0 /*offset*/, sizeof(ELEM_TYPE) * mn * nc, stream), &result, check); CHECK(c_dbcsr_acc_memcpy_h2d(trans_hst, trans_dev, sizeof(int) * nb, stream), &result, check); -# if defined(USE_LIBXSMM) CHECK(c_dbcsr_acc_stream_sync(stream), &result, check); - start = libxsmm_timer_tick(); -# endif + start = libxs_timer_tick(); CHECK(c_dbcsr_acc_memcpy_h2d(amat_hst, amat_dev, sizeof(ELEM_TYPE) * mk * na, stream), &result, check); CHECK(c_dbcsr_acc_memcpy_h2d(bmat_hst, bmat_dev, sizeof(ELEM_TYPE) * kn * nb, stream), &result, check); CHECK(c_dbcsr_acc_memcpy_h2d(stack_hst, stack_dev, sizeof(int) * 3 * stack_size, stream), &result, check); if (1 < nrepeat_h2d) { -# if defined(USE_LIBXSMM) CHECK(c_dbcsr_acc_stream_sync(stream), &result, check); - start = libxsmm_timer_tick(); -# endif + start = libxs_timer_tick(); for (r = 0; r < nrepeat_h2d; ++r) { CHECK(c_dbcsr_acc_memcpy_h2d(amat_hst, amat_dev, sizeof(ELEM_TYPE) * mk * na, stream), &result, check); CHECK(c_dbcsr_acc_memcpy_h2d(bmat_hst, bmat_dev, sizeof(ELEM_TYPE) * kn * nb, stream), &result, check); CHECK(c_dbcsr_acc_memcpy_h2d(stack_hst, stack_dev, sizeof(int) * 3 * stack_size, stream), &result, check); } } -# if defined(USE_LIBXSMM) CHECK(c_dbcsr_acc_stream_sync(stream), &result, check); if (NULL != amat_hst && NULL != bmat_hst && NULL != stack_hst && EXIT_SUCCESS == result) { const size_t size = (sizeof(ELEM_TYPE) * (mk * na + kn * nb) + sizeof(int) * 3 * stack_size); - duration = libxsmm_timer_duration(start, libxsmm_timer_tick()) / nrepeat_h2d; + duration = libxs_timer_duration(start, libxs_timer_tick()) / nrepeat_h2d; perf_h2d = size / (duration * (1ULL << 30)); PRINTF("copy-in (%i MB): %.2g ms %.1f GB/s\n", (int)((size + (1 << 19)) >> 20), 1000.0 * duration, perf_h2d); } -# endif #else amat_dev = amat_hst; bmat_dev = bmat_hst; @@ -431,7 +300,6 @@ int main(int argc, char* argv[]) { trans_dev = trans_hst; CHECK(c_dbcsr_acc_memset_zero(cmat_dev, 0 /*offset*/, sizeof(ELEM_TYPE) * mn * nc, stream), &result, check); #endif -#if defined(TRANSPOSE) && defined(VALIDATE) /* warmup execution and prebuild transpose-kernel */ for (r = 0; r < warmup / 2; ++r) { CHECK(libsmm_acc_transpose(trans_dev, 0 /*offset*/, nb, bmat_dev, DBCSR_TYPE(ELEM_TYPE), k, n, MAX_KERNEL_DIM, stream), @@ -439,18 +307,12 @@ int main(int argc, char* argv[]) { CHECK(libsmm_acc_transpose(trans_dev, 0 /*offset*/, nb, bmat_dev, DBCSR_TYPE(ELEM_TYPE), n, k, MAX_KERNEL_DIM, stream), &result, check); } -# if defined(USE_LIBXSMM) CHECK(c_dbcsr_acc_stream_sync(stream), &result, check); - start = libxsmm_timer_tick(); -# endif - /* to perform NN-SMMs on the device, all B-matrices are transposed upfront (SMM-kernel is limited to NT) */ + start = libxs_timer_tick(); CHECK(libsmm_acc_transpose(trans_dev, 0 /*offset*/, nb, bmat_dev, DBCSR_TYPE(ELEM_TYPE), k, n, MAX_KERNEL_DIM, stream), &result, check); -# if defined(USE_LIBXSMM) CHECK(c_dbcsr_acc_stream_sync(stream), &result, check); - transpose = libxsmm_timer_duration(start, libxsmm_timer_tick()); -# endif -#endif + transpose = libxs_timer_duration(start, libxs_timer_tick()); /* warmup execution and prebuild SMM-kernel */ for (r = 0; r < warmup; ++r) { CHECK(libsmm_acc_process(stack_hst, stack_dev, stack_size, DBCSR_TYPE(ELEM_TYPE), amat_dev, bmat_dev, cmat_dev, m, n, k, @@ -458,86 +320,78 @@ int main(int argc, char* argv[]) { &result, check); } CHECK(c_dbcsr_acc_memset_zero(cmat_dev, 0 /*offset*/, sizeof(ELEM_TYPE) * mn * nc, stream), &result, check); -#if defined(USE_LIBXSMM) CHECK(c_dbcsr_acc_stream_sync(stream), &result, check); - start = libxsmm_timer_tick(); -#endif + start = libxs_timer_tick(); for (r = 0; r < nrepeat; ++r) { - /* GPU-kernel is limited to C += Ai * Bi^T, i.e., NT (for NN, all Bi must be transposed upfront) */ CHECK(libsmm_acc_process(stack_hst, stack_dev, stack_size, DBCSR_TYPE(ELEM_TYPE), amat_dev, bmat_dev, cmat_dev, m, n, k, MAX_KERNEL_DIM, 1 /*homogeneous*/, stream, stream), &result, check); } -#if defined(USE_LIBXSMM) CHECK(c_dbcsr_acc_stream_sync(stream), &result, check); - duration = libxsmm_timer_duration(start, libxsmm_timer_tick()); + duration = libxs_timer_duration(start, libxs_timer_tick()); if (EXIT_SUCCESS == result) { if (0 < duration) { -# if defined(TRANSPOSE) && defined(VALIDATE) PRINTF("transpose: %.2g ms %.1f GFLOPS/s\n", 1000.0 * (duration + transpose) / (nrepeat * nrepeat_smm), 1E-9 * ((size_t)2 * m * n * k * stack_size * nrepeat * nrepeat_smm) / (duration + transpose)); -# endif perf_dev = 1E-9 * ((size_t)2 * m * n * k * stack_size * nrepeat * nrepeat_smm) / duration; PRINTF("device: %.2g ms %.1f GFLOPS/s\n", 1000.0 * duration / (nrepeat * nrepeat_smm), perf_dev); } else { -# if defined(TRANSPOSE) PRINTF("transpose: 0 ms 0 GFLOPS/s\n"); -# endif PRINTF("device: 0 ms 0 GFLOPS/s\n"); } } -# if defined(VALIDATE) if (EXIT_SUCCESS == result) { - ELEM_TYPE* const gold_hst = (ELEM_TYPE*)(0 != check ? libxsmm_malloc(sizeof(ELEM_TYPE) * mn * nc) : NULL); - /* determine host's performance independent of current result code/status */ + ELEM_TYPE* const gold_hst = (ELEM_TYPE*)(0 != check ? libxs_malloc(NULL, sizeof(ELEM_TYPE) * mn * nc, 0) : NULL); if (NULL != gold_hst && NULL != amat_hst && NULL != bmat_hst && NULL != stack_hst) { const ELEM_TYPE alpha = 1, beta = 1; - const char transa = 'N'; -# if defined(TRANSPOSE) - const char transb = 'N'; -# else - const char transb = 'T'; -# endif + const char transa = 'N', transb = 'N'; + libxs_registry_t* host_registry = libxs_registry_create(); + const libxs_gemm_config_t* const host_config = libxs_gemm_dispatch( + LIBXS_DATATYPE(ELEM_TYPE), transa, transb, m, n, k, m, k, m, &alpha, &beta, host_registry); memset(gold_hst, 0, sizeof(ELEM_TYPE) * mn * nc); for (r = 0; r < warmup; ++r) { - ACC_BENCH_GEMM_BATCH(LIBXSMM_DATATYPE(ELEM_TYPE), LIBXSMM_DATATYPE(ELEM_TYPE), &transa, &transb, m, n, k, &alpha, - amat_hst, &m /*lda*/, stack_hst + 0 /*stride_a*/, bmat_hst, &k /*ldb*/, stack_hst + 1 /*stride_b*/, &beta, gold_hst, - &m /*ldc*/, stack_hst + 2 /*stride_c*/, sizeof(int) * 3, 1 /*index_base*/, stack_size); +#if defined(_OPENMP) +# pragma omp parallel + libxs_gemm_index_task(amat_hst, stack_hst + 0 /*stride_a*/, bmat_hst, stack_hst + 1 /*stride_b*/, gold_hst, + stack_hst + 2 /*stride_c*/, sizeof(int) * 3, 1 /*index_base*/, stack_size, host_config, omp_get_thread_num(), + omp_get_num_threads()); +#else + libxs_gemm_index(amat_hst, stack_hst + 0 /*stride_a*/, bmat_hst, stack_hst + 1 /*stride_b*/, gold_hst, + stack_hst + 2 /*stride_c*/, sizeof(int) * 3, 1 /*index_base*/, stack_size, host_config); +#endif } memset(gold_hst, 0, sizeof(ELEM_TYPE) * mn * nc); - start = libxsmm_timer_tick(); - /* CPU-kernel operates on data that is not initialized in NUMA-aware fashion */ + start = libxs_timer_tick(); for (r = 0; r < (nrepeat * nrepeat_smm); ++r) { - ACC_BENCH_GEMM_BATCH(LIBXSMM_DATATYPE(ELEM_TYPE), LIBXSMM_DATATYPE(ELEM_TYPE), &transa, &transb, m, n, k, &alpha, - amat_hst, &m /*lda*/, stack_hst + 0 /*stride_a*/, bmat_hst, &k /*ldb*/, stack_hst + 1 /*stride_b*/, &beta, gold_hst, - &m /*ldc*/, stack_hst + 2 /*stride_c*/, sizeof(int) * 3, 1 /*index_base*/, stack_size); +#if defined(_OPENMP) +# pragma omp parallel + libxs_gemm_index_task(amat_hst, stack_hst + 0 /*stride_a*/, bmat_hst, stack_hst + 1 /*stride_b*/, gold_hst, + stack_hst + 2 /*stride_c*/, sizeof(int) * 3, 1 /*index_base*/, stack_size, host_config, omp_get_thread_num(), + omp_get_num_threads()); +#else + libxs_gemm_index(amat_hst, stack_hst + 0 /*stride_a*/, bmat_hst, stack_hst + 1 /*stride_b*/, gold_hst, + stack_hst + 2 /*stride_c*/, sizeof(int) * 3, 1 /*index_base*/, stack_size, host_config); +#endif } - duration = libxsmm_timer_duration(start, libxsmm_timer_tick()); + libxs_gemm_release_registry(host_registry); + duration = libxs_timer_duration(start, libxs_timer_tick()); perf_hst = 1E-9 * ((size_t)2 * m * n * k * stack_size * nrepeat * nrepeat_smm) / duration; PRINTF("host: %.2g ms %.1f GFLOPS/s\n", 1000.0 * duration / (nrepeat * nrepeat_smm), perf_hst); - /* validate correctness in case of successful result code/status */ if (EXIT_SUCCESS == result) { -# if !defined(__OFFLOAD_UNIFIED_MEMORY) || !defined(DEDUPLICATE) - /* transfer result from device to host for validation */ +#if !defined(__OFFLOAD_UNIFIED_MEMORY) || !defined(DEDUPLICATE) CHECK(c_dbcsr_acc_memcpy_d2h(cmat_dev, cmat_hst, sizeof(ELEM_TYPE) * mn * nc, stream), &result, check); CHECK(c_dbcsr_acc_stream_sync(stream), &result, check); -# endif -# if defined(USE_LIBXSMM) +#endif if (EXIT_SUCCESS == result) { - libxsmm_matdiff_info diff; - /* validate result buffers at once (including excess/padded space) */ - result = libxsmm_matdiff(&diff, LIBXSMM_DATATYPE(ELEM_TYPE), mn, nc, gold_hst, cmat_hst, &mn, &mn); + libxs_matdiff_t diff; + result = libxs_matdiff(&diff, LIBXS_DATATYPE(ELEM_TYPE), mn, nc, gold_hst, cmat_hst, &mn, &mn); if (EXIT_SUCCESS == result) { -# if defined(USE_LIBXSMM) && LIBXSMM_VERSION4(1, 17, 0, 0) < LIBXSMM_VERSION_NUMBER - const double epsilon = libxsmm_matdiff_epsilon(&diff); /* 1.0 - diff.rsq */ -# else - const double epsilon = diff.normf_rel; -# endif + const double epsilon = libxs_matdiff_epsilon(&diff); PRINTF("diff.cur: %g", epsilon); if (maxdiff < epsilon && NULL != file) maxdiff = epsilon; if (0 < epsilon) { - if (LIBXSMM_NOTNAN(diff.v_tst)) { + if (LIBXS_NOTNAN(diff.v_tst)) { PRINTF(" (|%g-%g|=%g)\n", diff.v_ref, diff.v_tst, diff.linf_abs); } else { @@ -551,13 +405,10 @@ int main(int argc, char* argv[]) { } else fprintf(stderr, "ERROR: failed to validate!\n"); } -# endif } } - libxsmm_free(gold_hst); + libxs_free(gold_hst); } -# endif -#endif CHECK(c_dbcsr_acc_host_mem_deallocate(stack_hst, stream), NULL, check); CHECK(c_dbcsr_acc_host_mem_deallocate(trans_hst, stream), NULL, check); CHECK(c_dbcsr_acc_host_mem_deallocate(amat_hst, stream), NULL, check); @@ -576,15 +427,12 @@ int main(int argc, char* argv[]) { if (NULL != file) PRINTF("\n"); ++nok; } -#if defined(USE_LIBXSMM) if (0 == result) { - LIBXSMM_STDIO_ACQUIRE(); + LIBXS_STDIO_ACQUIRE(); fputs(print_buffer, stdout); - LIBXSMM_STDIO_RELEASE(); + LIBXS_STDIO_RELEASE(); } - else -#endif - { + else { if (0 > result) fprintf(stderr, "WARNING: %ix%ix%i-kernel not available or unsuitable!\n", m, n, k); } if (NULL == file && (0 == result || (0 > result && 0 == check))) break; @@ -595,11 +443,8 @@ int main(int argc, char* argv[]) { CHECK(libsmm_acc_finalize(), NULL, check); #endif CHECK(c_dbcsr_acc_finalize(), NULL, check); -#if defined(USE_LIBXSMM) && defined(VALIDATE) if (1 < nok) printf("\ndiff.max: %g\n", maxdiff); -#endif if (EXIT_SUCCESS == result) { -#if defined(USE_LIBXSMM) if (NULL != env_check_h2d && 0 < perf_h2d) { const double check_h2d = atof(env_check_h2d); if (perf_h2d < check_h2d) result = EXIT_FAILURE; @@ -613,7 +458,6 @@ int main(int argc, char* argv[]) { if (perf_hst < check_hst) result = EXIT_FAILURE; } if (EXIT_SUCCESS != result) fprintf(stderr, "\nFAILED\n\n"); -#endif } else { if (NULL != file) fclose(file); @@ -622,3 +466,92 @@ int main(int argc, char* argv[]) { } return result; } + + +static void parse_params(int argc, char* argv[], FILE** file, const char** snr, const char** sss, const char** ssm, + const char** ssn, const char** ssk, const char** snc, const char** sna, const char** snb) { + char buffer[1024], *args[8]; + int i; + assert(file && snr && sss && ssm && ssn && ssk && snc && sna && snb); + --argc; + if (NULL == *file) *file = (1 <= argc ? fopen(argv[1], "r") : NULL); + if (NULL == *file) { + for (i = 0; i < argc; ++i) args[i] = argv[i + 1]; + } + else { /* input file is specified */ + argc = 0; + if (NULL != fgets(buffer, sizeof(buffer), *file)) { + char* arg = strtok(buffer, DELIMS); + while (NULL == arg && NULL != fgets(buffer, sizeof(buffer), *file)) { + arg = strtok(buffer, DELIMS); + } + for (; NULL != arg; arg = strtok(NULL, DELIMS)) { + if (argc * sizeof(*args) < sizeof(args)) args[argc++] = arg; + else { /* malformed command-line */ + fclose(*file); + *file = NULL; + break; + } + } + } + else { + fclose(*file); + *file = NULL; + } + } + i = 0; + if (i < argc) { + const char* x1 = strchr(args[i], 'x'); + const char* x2 = (NULL == x1 ? NULL : strchr(x1 + 1, 'x')); + if (NULL == x1 || NULL == x2) { /* accept "M N K" */ + *snr = args[i++]; + *sss = (i < argc ? args[i++] : NULL); + if (i < argc) { + x1 = strchr(args[i], 'x'); + x2 = (NULL == x1 ? NULL : strchr(x1 + 1, 'x')); + *ssm = args[i++]; + if (NULL == x1 || NULL == x2) { /* accept "M N K" */ + *ssn = (i < argc ? args[i++] : NULL); + *ssk = (i < argc ? args[i++] : NULL); + } + else { /* accept "MxNxK" */ + *ssn = x1 + 1; + *ssk = x2 + 1; + } + } + } + else { /* accept "MxNxK" */ + *ssm = args[i++]; + *ssn = x1 + 1; + *ssk = x2 + 1; + } + } + *snc = (i < argc ? args[i++] : NULL); + *sna = (i < argc ? args[i++] : NULL); + *snb = (i < argc ? args[i++] : NULL); +} + + +static size_t parse_nbytes(const char* nbytes, size_t* nelems) { + size_t result = 0; + if (NULL != nelems) *nelems = 0; + if (NULL != nbytes && '\0' != *nbytes) { + size_t u = strlen(nbytes) - 1; + const char units[] = "kmgKMG", *const unit = strchr(units, nbytes[u]); + char* end = NULL; + const long long int ibytes = strtol(nbytes, &end, 10); + if (NULL != end) { + if (NULL == unit && '\0' == *end) { + result = (size_t)ibytes; + if (NULL != nelems) *nelems = result; + } + else if (NULL != unit && *unit == *end) { + result = (size_t)ibytes; + if (NULL != nelems) *nelems = result; + u = (unit - units) % 3 + 1; + result <<= u * 10; + } + } + } + return result; +} diff --git a/src/acc/acc_bench.h b/src/acc/acc_bench.h index 3a7c8979623..216fac71a88 100644 --- a/src/acc/acc_bench.h +++ b/src/acc/acc_bench.h @@ -19,16 +19,14 @@ # define MAX(A, B) ((B) < (A) ? (A) : (B)) #endif -#if !defined(INLINE) && (defined(__cplusplus) || (defined(__STDC_VERSION__) && (199901L <= __STDC_VERSION__) /*C99*/)) -# define INLINE inline -#else -# define INLINE -#endif - #if !defined(MAX_KERNEL_DIM) # define MAX_KERNEL_DIM 80 #endif +/** + * Initialize a column-major M-by-N matrix with + * deterministic values derived from seed and scale. + */ #define INIT_MAT(ELEM_TYPE, SEED, MAT, M, N, SCALE) \ do { \ const double init_mat_seed1_ = (SCALE) * (SEED) + (SCALE); \ @@ -47,33 +45,37 @@ * The arguments rnd and rnd_size optionally allow * to supply an array of (pseudo-)random-numbers. */ -static INLINE void init_stack( - int* stack, int stack_size, int rnd_size, const int* rnd, int mn, int mk, int kn, int nc, int na, int nb) { - /* navg matrix products are accumulated into a C-matrix */ - const int navg = stack_size / nc; - const int nimb = MAX(1, navg - 4); /* imbalance */ - int i = 0, c = 0, ntop = 0; - assert(0 < nc && nc <= stack_size); - while (i < stack_size) { - const int r = ((NULL == rnd || 0 >= rnd_size) ? rand() : rnd[i % rnd_size]), next = c + 1; - ntop += navg + (r % (2 * nimb) - nimb); - if (stack_size < ntop) ntop = stack_size; - for (; i < ntop; ++i) { /* setup one-based indexes */ - int a, b; - if (NULL != rnd && 0 < rnd_size) { - a = rnd[(2 * i + 0) % rnd_size] % na; - b = rnd[(2 * i + 1) % rnd_size] % nb; - } - else { - a = rand() % na; - b = rand() % nb; - } - *stack++ = a * mk + 1; /* A-index */ - *stack++ = b * kn + 1; /* B-index */ - *stack++ = c * mn + 1; /* C-index */ - } - if (next < nc) c = next; - } -} +#define INIT_STACK(STACK, STACK_SIZE, RND_SIZE, RND, MN, MK, KN, NC, NA, NB) \ + do { \ + const int* init_stack_rnd_ = (const int*)(RND); \ + const int init_stack_rnd_size_ = MAX(1, (RND_SIZE)); \ + const int init_stack_navg_ = (STACK_SIZE) / (NC); \ + const int init_stack_nimb_ = MAX(1, init_stack_navg_ - 4); \ + int init_stack_i_ = 0, init_stack_c_ = 0, init_stack_ntop_ = 0; \ + int* init_stack_p_ = (STACK); \ + assert(0 < (NC) && (NC) <= (STACK_SIZE)); \ + while (init_stack_i_ < (STACK_SIZE)) { \ + const int init_stack_r_ = \ + ((NULL == init_stack_rnd_ || 0 >= (RND_SIZE)) ? rand() : init_stack_rnd_[init_stack_i_ % init_stack_rnd_size_]); \ + const int init_stack_next_ = init_stack_c_ + 1; \ + init_stack_ntop_ += init_stack_navg_ + (init_stack_r_ % (2 * init_stack_nimb_) - init_stack_nimb_); \ + if ((STACK_SIZE) < init_stack_ntop_) init_stack_ntop_ = (STACK_SIZE); \ + for (; init_stack_i_ < init_stack_ntop_; ++init_stack_i_) { \ + int init_stack_a_, init_stack_b_; \ + if (NULL != init_stack_rnd_ && 0 < (RND_SIZE)) { \ + init_stack_a_ = init_stack_rnd_[(2 * init_stack_i_ + 0) % init_stack_rnd_size_] % (NA); \ + init_stack_b_ = init_stack_rnd_[(2 * init_stack_i_ + 1) % init_stack_rnd_size_] % (NB); \ + } \ + else { \ + init_stack_a_ = rand() % (NA); \ + init_stack_b_ = rand() % (NB); \ + } \ + *init_stack_p_++ = init_stack_a_ * (MK) + 1; \ + *init_stack_p_++ = init_stack_b_ * (KN) + 1; \ + *init_stack_p_++ = init_stack_c_ * (MN) + 1; \ + } \ + if (init_stack_next_ < (NC)) init_stack_c_ = init_stack_next_; \ + } \ + } while (0) #endif /*DBCSR_ACC_BENCH_H*/ diff --git a/src/acc/libsmm_acc/libsmm_acc_benchmark.cpp b/src/acc/libsmm_acc/libsmm_acc_benchmark.cpp index c507e97e94a..e78688544cc 100644 --- a/src/acc/libsmm_acc/libsmm_acc_benchmark.cpp +++ b/src/acc/libsmm_acc/libsmm_acc_benchmark.cpp @@ -112,7 +112,7 @@ void matInit(double* mat, int mat_n, int x, int y, int seed) { // initialize the task list ("stack" in DBCSR lingo) // for each of the result matrices we have a random number void stackInit(int* stack, int n_stack, int n_c, int n_a, int n_b, int mat_m, int mat_n, int mat_k) { - init_stack(stack, n_stack, 0, NULL, mat_m * mat_n, mat_m * mat_k, mat_k * mat_n, n_c, n_a, n_b); + INIT_STACK(stack, n_stack, 0, NULL, mat_m * mat_n, mat_m * mat_k, mat_k * mat_n, n_c, n_a, n_b); } //=========================================================================== diff --git a/src/acc/opencl/Makefile b/src/acc/opencl/Makefile deleted file mode 100644 index 152db66843c..00000000000 --- a/src/acc/opencl/Makefile +++ /dev/null @@ -1,348 +0,0 @@ -MAKDIR := $(subst //,,$(dir $(firstword $(MAKEFILE_LIST)))/) -ACCDIR := $(MAKDIR)/.. -INCACC := $(wildcard $(MAKDIR)/*.h*) $(ACCDIR)/acc.h -SRCACC := $(wildcard $(MAKDIR)/*.c) -OBJACC := $(SRCACC:.c=.o) - -INCSMM := $(wildcard $(MAKDIR)/smm/*.h*) \ - $(MAKDIR)/smm/opencl_kernels.h \ - $(ACCDIR)/acc_libsmm.h \ - $(ACCDIR)/acc_bench.h \ - $(NULL) -SRCSMM := $(wildcard $(MAKDIR)/smm/*.c) -OBJSMM := $(SRCSMM:.c=.o) -KERNEL := $(wildcard $(MAKDIR)/smm/kernels/*.cl) - -INCALL := $(INCACC) $(INCSMM) - -LIBXSMMROOT := $(wildcard $(ACCDIR)/../../../../../libxsmm) -ifeq (,$(LIBXSMMROOT)) - LIBXSMMROOT := $(wildcard $(HOME)/libxsmm) -endif -UNAME := $(shell uname) -HEADERONLY ?= 0 -STATIC ?= 1 -DEV ?= 0 - -# Kind of Clang/GCC based analysis: -# leak, address, undefined, thread -SANITIZE ?= $(NULL) - -# Intel Compiler -ICX := $(shell which icx 2>/dev/null) -INTEL ?= $(if $(ICX),$(if $(filter-out 0,$(GNU)),0,2),0) - -# select from set of predefined triplet specifications -SPECID ?= 0 -# limit shape in tests (zero or negative for unlimited) -MAXEXT ?= 48 -# number of tests (zero or negative for unlimited) -NSMMS ?= 10 - -COMMAND := $(shell which command 2>/dev/null) -ifneq (,$(COMMAND)) - which = $(shell $(COMMAND) -v $1) -else - which = $(shell which $(firstword $1) 2>/dev/null) -endif - -WITH_GPU := $(if $(WITH_GPU),$(WITH_GPU),$(GPUVER)) -PARAMS_WITHGPU := $(MAKDIR)/smm/params/tune_multiply_$(WITH_GPU).csv -PARAMS_DEFAULT := $(MAKDIR)/smm/tune_multiply.csv -PARAMS := $(if $(wildcard $(PARAMS_WITHGPU)),$(PARAMS_WITHGPU),$(wildcard $(PARAMS_DEFAULT))) - -#PARAMDIR ?= $(MAKDIR)/smm/params -ifeq (,$(PARAMS)) -ifneq (,$(wildcard $(PARAMDIR))) - WITH_GPUS := $(shell ls -1 $(PARAMDIR)/*.csv | cut -d. -f1 | rev | cut -d_ -f1 | rev) -endif -endif - -CFLAGS := -fPIC \ - -Wall -Wextra -Wcast-qual \ - -Wno-overlength-strings \ - -Wno-variadic-macros \ - -Wno-unused-function \ - -Wno-long-long \ - -D__OPENCL \ - $(NULL) - -ifneq (,$(ELEM_TYPE)) - CFLAGS += -DELEM_TYPE=$(ELEM_TYPE) -endif - -USM ?= 0 -ifneq (0,$(USM)) - CFLAGS += -D__OFFLOAD_UNIFIED_MEMORY -endif - -ifneq (0,$(INTEL)) - ifneq (1,$(INTEL)) - CXX := icpx - CC := icx - else - CXX := icpc - CC := icc - endif - AR := $(if $(call which,xiar),xiar,ar) -else - CXX := g++ - CC := gcc - ifneq (Darwin,$(UNAME)) - AR := gcc-ar - else - AR := ar - endif -endif - -ifneq (0,$(DEV)) - ifeq (1,$(DEV)) - CFLAGS += -std=c89 - CFLAGS += -Wno-unused-parameter - else - # DEV=2 (and higher): linking is not intended - CFLAGS += -D__DBCSR_ACC - CFLAGS += -Wno-gnu-zero-variadic-macro-arguments - CFLAGS += -Wno-deprecated - CFLAGS += -Werror - ifneq (2,$(DEV)) - ifneq (,$(findstring clang,$(CC) $(CXX))) - override CC := clang++ --analyze - else - override CC := $(CXX) -xc++ - endif - else - override CC := $(CXX) -xc++ - endif - $(info CC: $(shell $(CC) --version | head -n1)) - OMP := 0 - endif - CFLAGS += -pedantic -#else - #CFLAGS += -std=c99 -endif - -ifneq (,$(SANITIZE)) - CXXFLAGS += -fsanitize=$(SANITIZE) - CFLAGS += -fsanitize=$(SANITIZE) - FCFLAGS += -fsanitize=$(SANITIZE) - LDFLAGS += -fsanitize=$(SANITIZE) - SYM = 1 -endif - -ifneq (0,$(DBG)) - CPP_OPENCL_FLAGS += -C - ifeq (,$(DBG)) - CFLAGS += -O2 -DNDEBUG - else - ifneq (1,$(DBG)) - CFLAGS += -D_DEBUG - endif - CFLAGS += -O0 - endif -else - CFLAGS += -O2 -DNDEBUG - SYM ?= 0 -endif -ifneq (0,$(SYM)) - CFLAGS += -g -endif - -ifneq (0,$(OMP)) - ifneq (0,$(INTEL)) - CFLAGS += -qopenmp - LDFLAGS += -qopenmp - else ifneq (Darwin,$(UNAME)) - CFLAGS += -fopenmp - LDFLAGS += -fopenmp - else # macOS - CFLAGS += -Xpreprocessor -fopenmp - LDFLAGS += -lomp - endif -endif - -ifneq (,$(LIBXSMMROOT)) - ifneq (0,$(STATIC)) - ifeq (0,$(HEADERONLY)) - ifneq (0,$(OMP)) - LDFLAGS += $(LIBXSMMROOT)/lib/libxsmmext.a - endif - LDFLAGS += $(LIBXSMMROOT)/lib/libxsmm.a - else - CFLAGS_XSMM += -DLIBXSMM_DEFAULT_CONFIG - endif - LDFLAGS += $(LIBXSMMROOT)/lib/libxsmmnoblas.a - else - LDFLAGS += -L$(LIBXSMMROOT)/lib - ifneq (Darwin,$(UNAME)) - LDFLAGS += -Wl,-rpath=$(LIBXSMMROOT)/lib - endif - ifneq (0,$(OMP)) - LDFLAGS += -lxsmmext - endif - LDFLAGS += -lxsmm -lxsmmnoblas - endif - CFLAGS_XSMM += -pthread -D__LIBXSMM -I$(LIBXSMMROOT)/include - LDFLAGS += -pthread -ldl -lm -endif - -ifeq (Darwin,$(UNAME)) - LDFLAGS += -framework OpenCL -else - OPENCL_LIB := $(shell ldconfig -p 2>/dev/null | grep -m1 OpenCL | rev | cut -d' ' -f1 | rev) - ifeq (,$(OPENCL_LIB)) - OPENCL_LIB := $(wildcard /usr/lib/x86_64-linux-gnu/libOpenCL.so.1) - endif - ifeq (,$(CUDATOOLKIT_HOME)) - CUDATOOLKIT_HOME := $(NVSDKCOMPUTE_ROOT) - endif - ifeq (,$(CUDATOOLKIT_HOME)) - NVCC := $(call which,nvcc) - CUDATOOLKIT_HOME := $(if $(NVCC),$(abspath $(dir $(NVCC))/..)) - endif - ifneq (,$(CUDATOOLKIT_HOME)) - CUDA_LIBDIR := $(if $(wildcard $(CUDATOOLKIT_HOME)/lib64),lib64,lib) - ifeq (,$(wildcard $(OPENCL_INC))) - CLINC := $(lastword $(sort $(wildcard $(CUDATOOLKIT_HOME)/../cuda/*/targets/x86_64-linux/include/CL/cl.h))) - OPENCL_INC := $(if $(CLINC),$(abspath $(dir $(CLINC))/..),$(CUDATOOLKIT_HOME)/include) - endif - ifeq (,$(wildcard $(OPENCL_LIB))) - LDFLAGS += -L$(CUDATOOLKIT_HOME)/$(CUDA_LIBDIR) - LDFLAGS += -Wl,-rpath=$(CUDATOOLKIT_HOME)/$(CUDA_LIBDIR) - endif - else ifeq (,$(OPENCL_INC)) - ifneq (,$(wildcard $(OPENCL_ROOT)/include/CL/cl.h)) - LDFLAGS += -L$(OPENCL_ROOT)/$(if $(wildcard $(OPENCL_ROOT)/lib64),lib64,lib) - OPENCL_INC := $(OPENCL_ROOT)/include - else ifneq (,$(ICX)) - OPENCL_ROOT := $(abspath $(dir $(ICX))/..) - CLINC := $(wildcard $(OPENCL_ROOT)/include/sycl/CL/cl.h $(OPENCL_ROOT)/include/CL/cl.h) - ifneq (,$(CLINC)) - LDFLAGS += -L$(OPENCL_ROOT)/$(if $(wildcard $(OPENCL_ROOT)/lib64),lib64,lib) - LDFLAGS += -L$(OPENCL_ROOT)/compiler/lib/intel64 -lintlc - OPENCL_INC := $(abspath $(dir $(firstword $(CLINC)))/..) - endif - endif - endif - # OPENCL_INC: directory containing CL/cl.h. - ifneq (,$(wildcard $(OPENCL_INC))) - CFLAGS += -I$(OPENCL_INC) - endif - # OPENCL_LIB: file/library to be linked - ifneq (,$(wildcard $(OPENCL_LIB))) - LDFLAGS += $(OPENCL_LIB) - else - LDFLAGS += -l:libOpenCL.so.1 - endif -endif - -# Collect all paths in LD_LIBRARY_PATH and LD_LIBRARY_PATH/stubs, and append to LDFLAGS -LD_LIBRARY_DIRS := $(wildcard $(subst :, ,$(LD_LIBRARY_PATH))) -LD_LIBSTUB_PATH := $(wildcard $(patsubst %,%/stubs,$(LD_LIBRARY_DIRS))) -LIBPATHS := $(foreach DIR,$(LD_LIBRARY_DIRS),$(if $(filter -L$(DIR),$(LDFLAGS)),$(NULL),-L$(DIR))) -LIBSTUBS := $(foreach DIR,$(LD_LIBSTUB_PATH),$(if $(filter -L$(DIR),$(LDFLAGS)),$(NULL),-L$(DIR))) -LDFLAGS += $(LIBPATHS) $(LIBSTUBS) - -.PHONY: bench -bench: $(ACCDIR)/acc_bench - -.PHONY: all -all: bench $(ACCDIR)/dbcsr_acc_test - -.PHONY: test -test: test-interface test-smm - -.PHONY: test-interface -test-interface: $(ACCDIR)/dbcsr_acc_test - @echo "--- DBCSR Backend Interface" - $(ACCDIR)/dbcsr_acc_test - -$(MAKDIR)/test-smm.log: bench - $(eval SHAPES = $(shell $(ACCDIR)/acc_triplets.sh -k $(SPECID) -m $(MAXEXT) -n $(NSMMS))) - $(eval DEVICE = "$(shell LIBXSMM_VERBOSE=0 ACC_OPENCL_VERBOSE=1 CHECK=0 $(ACCDIR)/acc_bench 1 1 1 2>&1 >/dev/null)") - $(eval WITH_GPU = $(firstword $(foreach GPU,$(WITH_GPUS),$(findstring $(GPU),$(DEVICE))))) - $(eval PARAMS = $(firstword $(wildcard $(PARAMDIR)/tune_multiply_$(WITH_GPU).csv))) - $(eval GPUENV = $(if $(OPENCL_LIBSMM_SMM_PARAMS),$(NULL),$(if $(PARAMS),OPENCL_LIBSMM_SMM_PARAMS=$(PARAMS)))) - @echo "--- DBCSR OpenCL SMMs ($(words $(SHAPES)))" - @echo "$(DEVICE)" - @if [ "$(GPUENV)" ]; then echo "$(GPUENV)"; fi - @echo "LD_LIBRARY_PATH=${LD_LIBRARY_PATH}" -ifneq (,$(LD_PRELOAD)) - @echo "LD_PRELOAD=${LD_PRELOAD}" -endif - @echo "CC: $$($(CC) --version | head -n1)" - @echo "runtime libraries:" - @ldd $(ACCDIR)/acc_bench - @echo "hostname: $$(hostname)" - @echo - @echo "$(SHAPES)" | xargs -n1 | ($(GPUENV) CHECK=$(if $(CHECK),$(CHECK),1) stdbuf --output=L \ - $(ACCDIR)/acc_bench /dev/stdin 2>$(MAKDIR)/test-smm.err && rm $(MAKDIR)/test-smm.err) | tee $@ - -.PHONY: test-smm -test-smm: $(MAKDIR)/test-smm.log -ifneq (,$(call which,datamash)) -ifeq (,$(shell datamash geomean 2>&1 | grep invalid)) - @echo "geomean: $$(sed -n "/device:/p" $< 2>/dev/null | datamash -W -R 1 geomean 4) GFLOPS/s" -endif - @echo "median: $$(sed -n "/device:/p" $< 2>/dev/null | datamash -W -R 1 median 4) GFLOPS/s" - @echo "mean: $$(sed -n "/device:/p" $< 2>/dev/null | datamash -W -R 1 mean 4) GFLOPS/s" -endif - @if [ -s $(MAKDIR)/test-smm.err ]; then \ - echo && cat $(MAKDIR)/test-smm.err; \ - if [ "0" != "$(if $(CHECK),$(CHECK),1)" ]; then exit 1; fi; \ - fi - -$(MAKDIR)/smm/opencl_kernels.h: $(MAKDIR)/acc_opencl.sh $(KERNEL) $(PARAMS) - CPPFLAGS=$(CPP_OPENCL_FLAGS) $(MAKDIR)/acc_opencl.sh $(KERNEL) $(PARAMS) $@ - -.PHONY: backend -backend: $(ACCDIR)/dbcsr_acc.a -$(ACCDIR)/dbcsr_acc.a: $(OBJACC) - $(AR) -rs $@ $^ - -.PHONY: libsmm -libsmm: $(ACCDIR)/dbcsr_acc_smm.a -$(ACCDIR)/dbcsr_acc_smm.a: $(OBJSMM) - $(AR) -rs $@ $^ - -%.o: %.c $(INCALL) $(MAKDIR)/Makefile - $(CC) $(CFLAGS) $(CFLAGS_XSMM) -c $< -o $@ - -$(MAKDIR)/acc_bench.o: $(ACCDIR)/acc_bench.c $(MAKDIR)/Makefile -ifneq (0,$(LIBXSMM)) - $(CC) $(CFLAGS) $(CFLAGS_XSMM) -c $< -o $@ -else - $(CC) $(CFLAGS) -c $< -o $@ -endif - -$(ACCDIR)/acc_bench: $(MAKDIR)/acc_bench.o $(ACCDIR)/dbcsr_acc_smm.a $(ACCDIR)/dbcsr_acc.a -ifneq (,$(filter 0 1,$(DEV))) - $(CC) $^ $(LDFLAGS) -o $@ -else -.PHONY: $(ACCDIR)/acc_bench -endif - -$(MAKDIR)/dbcsr_acc_test.o: $(ACCDIR)/../../tests/dbcsr_acc_test.c $(MAKDIR)/Makefile - $(CC) $(CFLAGS) -I$(ACCDIR)/.. -c $< -o $@ - -$(ACCDIR)/dbcsr_acc_test: $(MAKDIR)/dbcsr_acc_test.o $(ACCDIR)/dbcsr_acc.a -ifneq (,$(filter 0 1,$(DEV))) - $(CC) $^ $(LDFLAGS) -o $@ -else -.PHONY: $(ACCDIR)/dbcsr_acc_test -endif - -.PHONY: clean -clean: - @rm -f $(OBJACC) $(OBJSMM) - @rm -f $(MAKDIR)/dbcsr_acc_test.o - @rm -f $(MAKDIR)/acc_bench.o - @rm -f $(MAKDIR)/smm/opencl_kernels.h - @rm -f $(MAKDIR)/test-smm.err - -.PHONY: realclean -realclean: clean - @rm -f $(ACCDIR)/dbcsr_acc.a $(ACCDIR)/dbcsr_acc_smm.a - @rm -f $(ACCDIR)/acc_bench - @rm -f $(ACCDIR)/dbcsr_acc_test - @rm -f $(MAKDIR)/test-smm.log diff --git a/src/acc/opencl/PACKAGE b/src/acc/opencl/PACKAGE deleted file mode 100644 index 1c6d937d11b..00000000000 --- a/src/acc/opencl/PACKAGE +++ /dev/null @@ -1,5 +0,0 @@ -{ -"description": "OpenCL backend for accelerator API", -"archive": "libdbcsr", -"requires": [".."] -} diff --git a/src/acc/opencl/README.md b/src/acc/opencl/README.md deleted file mode 100644 index ef62147fc0a..00000000000 --- a/src/acc/opencl/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# Backend - -The OpenCL backend implements the [ACC interface](https://github.com/cp2k/dbcsr/blob/develop/src/acc/acc.h), which is exposed in Fortran and used throughout DBCSR's code base to drive (GPU-)acceleration based on ACC's device enumeration, data movement, and synchronization functionality. By design, DBCSR activates one device per rank (process). For instance, multiple GPUs can be used by the means of multiple ranks per system or at least one rank per device. The LIBSMM library complements the backend and implements the [ACC LIBSMM interface](https://github.com/cp2k/dbcsr/blob/develop/src/acc/acc_libsmm.h). - -All major GPU vendors support OpenCL even if the vendor-preferred programming model suggests otherwise. On Nvidia GPUs, the OpenCL backend can be used with CUDA based GPU-code in other portions of CP2K. The OpenCL based backend provides the following benefits: - -* Code portability between GPU vendors (if not performance portability). For instance, performance of the OpenCL backend matches the performance of the CUDA backend or exceeds it. -* Acceptable performance for kernels not covered by specifically tuned parameters, and the ability to run on GPU if no tuned parameters are present. -* Auto-tuning kernels within an acceptable time limit along with handy scripts to retune parameters and to carry forward an existing set (new GPU). - -Runtime settings are made by the means of environment variables. The OpenCL backend provides `acc_getenv.sh` to list all occurrences of `getenv` categorized into "OpenCL Backend environment variables" and "OpenCL LIBSMM environment variables". Common backend related settings are: - -* `ACC_OPENCL_DEVSPLIT`: integer enabling devices to be split into subdevices (non-zero/default: subdevices, zero: aggregated). -* `ACC_OPENCL_DEVTYPE`: character string selecting "cpu", "gpu", "all" (unfiltered), or any other string (neither CPU or GPU). -* `ACC_OPENCL_DEVICE`: non-negative integer number to select a device from the (internally enumerated) list of devices. -* `ACC_OPENCL_VENDOR`: character string matching the vendor of the OpenCL device in a case-insensitive fashion, e.g., "intel". -* `ACC_OPENCL_VERBOSE`: verbosity level (integer) with console output on `stderr`. - * `ACC_OPENCL_VERBOSE=1`: outputs the number of devices found and the name of the selected device. - * `ACC_OPENCL_VERBOSE=2`: outputs the duration needed to generate a requested kernel. - * `ACC_OPENCL_VERBOSE=3`: outputs device-side performance of kernels (every launch profiled). -* `ACC_OPENCL_DUMP`: dump preprocessed kernel source code (1) or dump compiled OpenCL kernels (2). - * `ACC_OPENCL_DUMP=1`: dump preprocessed kernel source code and use it for JIT compilation. Instantiates the original source code using preprocessor definitions (`-D`) and collapses the code accordingly. - * `ACC_OPENCL_DUMP=2`: dump compiled OpenCL kernels (depends on OpenCL implementation), e.g., PTX code on Nvidia. - -The OpenCL backend enumerates and orders devices by kind, i.e., GPU, CPU, and "other" (primary criterion) and by memory capacity (secondary criterion). Device IDs are zero-based as defined by the ACC interface (and less than what is permitted by `acc_get_ndevices`). diff --git a/src/acc/opencl/acc_getenv.sh b/src/acc/opencl/acc_getenv.sh deleted file mode 100755 index d81aedd032b..00000000000 --- a/src/acc/opencl/acc_getenv.sh +++ /dev/null @@ -1,48 +0,0 @@ -#!/usr/bin/env bash -#################################################################################################### -# Copyright (C) by the DBCSR developers group - All rights reserved # -# This file is part of the DBCSR library. # -# # -# For information on the license, see the LICENSE file. # -# For further information please visit https://dbcsr.cp2k.org # -# SPDX-License-Identifier: BSD-3-Clause # -#################################################################################################### - -FIND=$(command -v find) -SORT=$(command -v sort) -SED=$(command -v gsed) - -# GNU sed is desired (macOS) -if [ ! "${SED}" ]; then - SED=$(command -v sed) -fi - -HERE="$(cd "$(dirname "$0")" && pwd -P)" -SRC="${HERE}" -EXT="c" - -if [ "${FIND}" ] && [ "${SORT}" ] && [ "${SED}" ] && [ -d "${SRC}" ]; then - export LC_ALL=C - ENVARS="$(${FIND} "${SRC}" -type f -name "*.${EXT}" -exec \ - "${SED}" "s/getenv[[:space:]]*([[:space:]]*\".[^\"]*/\n&/g" {} \; | \ - "${SED}" -n "s/.*getenv[[:space:]]*([[:space:]]*\"\(.[^\"]*\)..*/\1/p" | \ - ${SORT} -u)" - OTHERS=$(echo "${ENVARS}" | ${SED} "/ACC_OPENCL_/d;/OPENCL_LIBSMM_/d") - if [ "${OTHERS}" ]; then - echo "====================================" - echo "Other environment variables" - echo "====================================" - echo "${ENVARS}" | ${SED} "/ACC_OPENCL_/d;/OPENCL_LIBSMM_/d" - fi - echo "====================================" - echo "OpenCL Backend environment variables" - echo "====================================" - echo "${ENVARS}" | ${SED} -n "/ACC_OPENCL_/p" - echo "====================================" - echo "OpenCL LIBSMM environment variables" - echo "====================================" - echo "${ENVARS}" | ${SED} -n "/OPENCL_LIBSMM_/p" -else - >&2 echo "Error: missing prerequisites!" - exit 1 -fi diff --git a/src/acc/opencl/acc_opencl.c b/src/acc/opencl/acc_opencl.c deleted file mode 100644 index f997c33715f..00000000000 --- a/src/acc/opencl/acc_opencl.c +++ /dev/null @@ -1,2091 +0,0 @@ -/*------------------------------------------------------------------------------------------------*/ -/* Copyright (C) by the DBCSR developers group - All rights reserved */ -/* This file is part of the DBCSR library. */ -/* */ -/* For information on the license, see the LICENSE file. */ -/* For further information please visit https://dbcsr.cp2k.org */ -/* SPDX-License-Identifier: BSD-3-Clause */ -/*------------------------------------------------------------------------------------------------*/ -#if defined(__OPENCL) -# include "acc_opencl.h" -# include -# include -# include -# include -# if defined(_WIN32) -# include -# include -# else -# include -# include -# include -# endif -# if defined(__DBCSR_ACC) -# include "../acc_libsmm.h" -# endif -# include -# include -# if !defined(S_ISDIR) && defined(S_IFMT) && defined(S_IFDIR) -# define S_ISDIR(A) ((S_IFMT & (A)) == S_IFDIR) -# endif -# if !defined(S_IREAD) -# define S_IREAD S_IRUSR -# endif -# if !defined(S_IWRITE) -# define S_IWRITE S_IWUSR -# endif - -# if !defined(ACC_OPENCL_NLOCKS) -# define ACC_OPENCL_NLOCKS 4 -# endif -# if !defined(ACC_OPENCL_TEMPDIR) && 1 -# define ACC_OPENCL_TEMPDIR "/tmp" -# endif -# if !defined(ACC_OPENCL_CACHE_DID) && 1 -# define ACC_OPENCL_CACHE_DID -# endif -# if !defined(ACC_OPENCL_CACHE_DIR) && 0 -# define ACC_OPENCL_CACHE_DIR ".cl_cache" -# endif -# if !defined(ACC_OPENCL_CPPBIN) && 1 -# define ACC_OPENCL_CPPBIN "/usr/bin/cpp" -# endif -# if !defined(ACC_OPENCL_SEDBIN) && 1 -# define ACC_OPENCL_SEDBIN "/usr/bin/sed" -# endif -/* disabled: let MPI runtime come up before */ -# if !defined(ACC_OPENCL_PREINIT) && 0 -# define ACC_OPENCL_PREINIT -# endif -/* attempt to enable command aggregation */ -# if !defined(ACC_OPENCL_CMDAGR) && 1 -# define ACC_OPENCL_CMDAGR -# endif -# if !defined(ACC_OPENCL_NCCS) && 1 -# define ACC_OPENCL_NCCS 0 -# endif - - -# if defined(__cplusplus) -extern "C" { -# endif - -char c_dbcsr_acc_opencl_locks[ACC_OPENCL_CACHELINE * ACC_OPENCL_NLOCKS]; -/* global configuration discovered during initialization */ -c_dbcsr_acc_opencl_config_t c_dbcsr_acc_opencl_config; - -# if defined(ACC_OPENCL_CACHE_DID) -int c_dbcsr_acc_opencl_active_id; -# endif - - -void c_dbcsr_acc_opencl_notify(const char /*errinfo*/[], const void* /*private_info*/, size_t /*cb*/, void* /*user_data*/); -void c_dbcsr_acc_opencl_notify(const char errinfo[], const void* private_info, size_t cb, void* user_data) { - LIBXSMM_UNUSED(private_info); - LIBXSMM_UNUSED(cb); - LIBXSMM_UNUSED(user_data); - fprintf(stderr, "ERROR ACC/OpenCL: %s\n", errinfo); -} - - -/** - * Comparator used with qsort; stabilized by tail condition (a < b ? -1 : 1). - * Brings GPUs with local memory in front, followed by (potentially) integrated GPUs, - * and further orders by memory capacity. - */ -int c_dbcsr_acc_opencl_order_devices(const void* /*dev_a*/, const void* /*dev_b*/); -int c_dbcsr_acc_opencl_order_devices(const void* dev_a, const void* dev_b) { - const cl_device_id* const a = (const cl_device_id*)dev_a; - const cl_device_id* const b = (const cl_device_id*)dev_b; - cl_device_type type_a = 0, type_b = 0; - assert(NULL != a && NULL != b && a != b); - ACC_OPENCL_EXPECT(EXIT_SUCCESS == clGetDeviceInfo(*a, CL_DEVICE_TYPE, sizeof(cl_device_type), &type_a, NULL)); - ACC_OPENCL_EXPECT(EXIT_SUCCESS == clGetDeviceInfo(*b, CL_DEVICE_TYPE, sizeof(cl_device_type), &type_b, NULL)); - if (CL_DEVICE_TYPE_DEFAULT & type_a) { - return -1; - } - else if (CL_DEVICE_TYPE_DEFAULT & type_b) { - return 1; - } - else { - if (CL_DEVICE_TYPE_GPU & type_a) { - if (CL_DEVICE_TYPE_GPU & type_b) { - int unified_a, unified_b; - size_t size_a, size_b; - ACC_OPENCL_EXPECT(EXIT_SUCCESS == c_dbcsr_acc_opencl_info_devmem(*a, NULL, &size_a, NULL, &unified_a)); - ACC_OPENCL_EXPECT(EXIT_SUCCESS == c_dbcsr_acc_opencl_info_devmem(*b, NULL, &size_b, NULL, &unified_b)); - if ((0 == unified_a && 0 == unified_b) || (0 != unified_a && 0 != unified_b)) { - return (size_a < size_b ? 1 : (size_a != size_b ? -1 : (a < b ? -1 : 1))); - } - /* discrete GPU goes in front */ - else if (0 == unified_b) return 1; - else return -1; - } - else return -1; - } - else if (CL_DEVICE_TYPE_GPU & type_b) { - return 1; - } - else { - if (CL_DEVICE_TYPE_CPU & type_a) { - if (CL_DEVICE_TYPE_CPU & type_b) { - size_t size_a, size_b; - ACC_OPENCL_EXPECT(EXIT_SUCCESS == c_dbcsr_acc_opencl_info_devmem(*a, NULL, &size_a, NULL, NULL)); - ACC_OPENCL_EXPECT(EXIT_SUCCESS == c_dbcsr_acc_opencl_info_devmem(*b, NULL, &size_b, NULL, NULL)); - return (size_a < size_b ? 1 : (size_a != size_b ? -1 : (a < b ? -1 : 1))); - } - else return -1; - } - else if (CL_DEVICE_TYPE_CPU & type_b) { - return 1; - } - else { - size_t size_a = 0, size_b = 0; - ACC_OPENCL_EXPECT(EXIT_SUCCESS == c_dbcsr_acc_opencl_info_devmem(*a, NULL, &size_a, NULL, NULL)); - ACC_OPENCL_EXPECT(EXIT_SUCCESS == c_dbcsr_acc_opencl_info_devmem(*b, NULL, &size_b, NULL, NULL)); - return (size_a < size_b ? 1 : (size_a != size_b ? -1 : (a < b ? -1 : 1))); - } - } - } -} - - -/** Setup to run prior to touching OpenCL runtime. */ -void c_dbcsr_acc_opencl_configure(void); -void c_dbcsr_acc_opencl_configure(void) { - const char* const env_rank = (NULL != getenv("PMI_RANK") ? getenv("PMI_RANK") : getenv("OMPI_COMM_WORLD_LOCAL_RANK")); - const char* const env_nranks = getenv("MPI_LOCALNRANKS"); /* TODO */ - const char *const env_devsplit = getenv("ACC_OPENCL_DEVSPLIT"), *const env_nlocks = getenv("ACC_OPENCL_NLOCKS"); - const char *const env_verbose = getenv("ACC_OPENCL_VERBOSE"), *const env_dump_acc = getenv("ACC_OPENCL_DUMP"); - const char *const env_debug = getenv("ACC_OPENCL_DEBUG"), *const env_profile = getenv("ACC_OPENCL_PROFILE"); - const char* const env_dump = (NULL != env_dump_acc ? env_dump_acc : getenv("IGC_ShaderDumpEnable")); - const char *const env_neo = getenv("NEOReadDebugKeys"), *const env_wa = getenv("ACC_OPENCL_WA"); - static char neo_enable_debug_keys[] = "NEOReadDebugKeys=1"; -# if defined(ACC_OPENCL_STREAM_PRIORITIES) - const char* const env_priority = getenv("ACC_OPENCL_PRIORITY"); -# endif -# if defined(ACC_OPENCL_NCCS) - const char* const env_nccs = getenv("ACC_OPENCL_NCCS"); - const int nccs = (NULL == env_nccs ? ACC_OPENCL_NCCS : atoi(env_nccs)); -# endif -# if defined(ACC_OPENCL_XHINTS) - const char* const env_xhints = (ACC_OPENCL_XHINTS); - const int xhints_default = 1 + 2 + 4 + 8 + 16; -# else - const char* const env_xhints = NULL; - const int xhints_default = 0; -# endif -# if defined(ACC_OPENCL_ASYNC) - const char* const env_async = (ACC_OPENCL_ASYNC); - const int async_default = 1 + 2 + 4 + 8; -# else - const char* const env_async = NULL; - const int async_default = 0; -# endif - const int nlocks = (NULL == env_nlocks ? 1 /*default*/ : atoi(env_nlocks)); - const int neo = (NULL == env_neo ? 1 : atoi(env_neo)); - int i; -# if defined(_OPENMP) - const int max_threads = omp_get_max_threads(), num_threads = omp_get_num_threads(); - memset(&c_dbcsr_acc_opencl_config, 0, sizeof(c_dbcsr_acc_opencl_config)); - c_dbcsr_acc_opencl_config.nthreads = (num_threads < max_threads ? max_threads : num_threads); -# else - memset(&c_dbcsr_acc_opencl_config, 0, sizeof(c_dbcsr_acc_opencl_config)); - c_dbcsr_acc_opencl_config.nthreads = 1; -# endif - assert(NULL == c_dbcsr_acc_opencl_config.lock_main); /* test condition to avoid initializing multiple times */ - libxsmm_init(); /* before using LIBXSMM's functionality */ - c_dbcsr_acc_opencl_config.nranks = LIBXSMM_MAX(NULL != env_nranks ? atoi(env_nranks) : 1, 1); - c_dbcsr_acc_opencl_config.nrank = (NULL != env_rank ? atoi(env_rank) : 0) % c_dbcsr_acc_opencl_config.nranks; - assert(sizeof(ACC_OPENCL_LOCKTYPE) <= ACC_OPENCL_CACHELINE); - for (i = 0; i < ACC_OPENCL_NLOCKS; ++i) { - ACC_OPENCL_INIT((ACC_OPENCL_LOCKTYPE*)(c_dbcsr_acc_opencl_locks + ACC_OPENCL_CACHELINE * i)); - } - c_dbcsr_acc_opencl_config.lock_main = (ACC_OPENCL_LOCKTYPE*)c_dbcsr_acc_opencl_locks; - c_dbcsr_acc_opencl_config.lock_memory = /* 2nd lock-domain */ - (1 < LIBXSMM_MIN(nlocks, ACC_OPENCL_NLOCKS) ? ((ACC_OPENCL_LOCKTYPE*)(c_dbcsr_acc_opencl_locks + ACC_OPENCL_CACHELINE * 1)) - : c_dbcsr_acc_opencl_config.lock_main); - c_dbcsr_acc_opencl_config.lock_stream = /* 3rd lock-domain */ - (2 < LIBXSMM_MIN(nlocks, ACC_OPENCL_NLOCKS) ? ((ACC_OPENCL_LOCKTYPE*)(c_dbcsr_acc_opencl_locks + ACC_OPENCL_CACHELINE * 2)) - : c_dbcsr_acc_opencl_config.lock_main); - c_dbcsr_acc_opencl_config.lock_event = /* 4th lock-domain */ - (3 < LIBXSMM_MIN(nlocks, ACC_OPENCL_NLOCKS) ? ((ACC_OPENCL_LOCKTYPE*)(c_dbcsr_acc_opencl_locks + ACC_OPENCL_CACHELINE * 3)) - : c_dbcsr_acc_opencl_config.lock_main); - c_dbcsr_acc_opencl_config.verbosity = (NULL == env_verbose ? 0 : atoi(env_verbose)); - c_dbcsr_acc_opencl_config.devsplit = (NULL == env_devsplit ? (/*1 < c_dbcsr_acc_opencl_config.nranks ? -1 :*/ 0) - : atoi(env_devsplit)); -# if defined(ACC_OPENCL_STREAM_PRIORITIES) - c_dbcsr_acc_opencl_config.priority = (NULL == env_priority ? /*default*/ 3 : atoi(env_priority)); -# endif - c_dbcsr_acc_opencl_config.profile = (NULL == env_profile ? /*default*/ 0 : atoi(env_profile)); - c_dbcsr_acc_opencl_config.xhints = (NULL == env_xhints ? xhints_default : atoi(env_xhints)); - c_dbcsr_acc_opencl_config.async = (NULL == env_async ? async_default : atoi(env_async)); - c_dbcsr_acc_opencl_config.dump = (NULL == env_dump ? /*default*/ 0 : atoi(env_dump)); - c_dbcsr_acc_opencl_config.debug = (NULL == env_debug ? c_dbcsr_acc_opencl_config.dump : atoi(env_debug)); - c_dbcsr_acc_opencl_config.wa = neo * (NULL == env_wa ? ((1 != c_dbcsr_acc_opencl_config.devsplit ? 0 : 1) + (2 + 4 + 8)) - : atoi(env_wa)); -# if defined(ACC_OPENCL_CACHE_DIR) - { /* environment is populated before touching the compute runtime */ - const char *const env_cache = getenv("ACC_OPENCL_CACHE"), *env_cachedir = getenv("NEO_CACHE_DIR"); - int cache = (NULL == env_cache ? 0 : atoi(env_cache)); - struct stat cachedir; - if (0 == cache) { - if (stat(ACC_OPENCL_CACHE_DIR, &cachedir) == 0 && S_ISDIR(cachedir.st_mode)) cache = 1; - else if (stat(ACC_OPENCL_TEMPDIR "/" ACC_OPENCL_CACHE_DIR, &cachedir) == 0 && S_ISDIR(cachedir.st_mode)) cache = 2; - } - if (1 == cache) { - static char neo_cachedir[] = "NEO_CACHE_DIR=" ACC_OPENCL_CACHE_DIR; - static char ocl_cachedir[] = "cl_cache_dir=" ACC_OPENCL_CACHE_DIR; - ACC_OPENCL_EXPECT(0 == LIBXSMM_PUTENV(neo_cachedir)); /* putenv before entering OpenCL */ - ACC_OPENCL_EXPECT(0 == LIBXSMM_PUTENV(ocl_cachedir)); /* putenv before entering OpenCL */ - env_cachedir = ACC_OPENCL_CACHE_DIR; - } -# if defined(ACC_OPENCL_TEMPDIR) - else if (NULL == env_cachedir) { /* code-path entered by default */ - if (NULL == env_cache || 0 != cache) { /* customize NEO_CACHE_DIR unless ACC_OPENCL_CACHE=0 */ - static char neo_cachedir[] = "NEO_CACHE_DIR=" ACC_OPENCL_TEMPDIR "/" ACC_OPENCL_CACHE_DIR; - ACC_OPENCL_EXPECT(0 == LIBXSMM_PUTENV(neo_cachedir)); /* putenv before entering OpenCL */ - env_cachedir = ACC_OPENCL_TEMPDIR "/" ACC_OPENCL_CACHE_DIR; - } - if (0 != cache) { /* legacy-NEO is treated with explicit opt-in */ - static char ocl_cachedir[] = "cl_cache_dir=" ACC_OPENCL_TEMPDIR "/" ACC_OPENCL_CACHE_DIR; - ACC_OPENCL_EXPECT(0 == LIBXSMM_PUTENV(ocl_cachedir)); /* putenv before entering OpenCL */ - } - } -# endif - if (NULL != env_cachedir) { -# if defined(_WIN32) - LIBXSMM_UNUSED(env_cachedir); -# else -# if defined(S_IRWXU) && defined(S_IRGRP) && defined(S_IXGRP) && defined(S_IROTH) && defined(S_IXOTH) - const int mode = S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH; -# else - const int mode = 0xFFFFFFFF; -# endif - ACC_OPENCL_EXPECT(0 == mkdir(env_cachedir, mode) || EEXIST == errno); /* soft-error */ -# endif - } - } -# endif -# if defined(ACC_OPENCL_NCCS) - if (0 != nccs && NULL == getenv("ZEX_NUMBER_OF_CCS")) { - static char zex_nccs[ACC_OPENCL_MAXNDEVS * 8 + 32] = "ZEX_NUMBER_OF_CCS="; - const int mode = ((1 == nccs || 2 == nccs) ? nccs : 4); - int j = strlen(zex_nccs); - for (i = 0; i < ACC_OPENCL_MAXNDEVS; ++i) { - const char* const istr = (0 < i ? ",%u:%i" : "%u:%i"); - const int n = LIBXSMM_SNPRINTF(zex_nccs + j, sizeof(zex_nccs) - j, istr, i, mode); - if (0 < n) j += n; - else { - j = 0; - break; - } - } - if (0 < j && 0 == LIBXSMM_PUTENV(zex_nccs) && /* populate before touching the compute runtime */ - (2 <= c_dbcsr_acc_opencl_config.verbosity || 0 > c_dbcsr_acc_opencl_config.verbosity)) - { - fprintf(stderr, "INFO ACC/OpenCL: support multiple separate compute command streamers (%i-CCS mode)\n", mode); - } - } -# endif - if (0 != neo && (NULL != env_neo || 0 == LIBXSMM_PUTENV(neo_enable_debug_keys))) { - if ((1 + 2 + 4) & c_dbcsr_acc_opencl_config.wa) { - static char a[] = "ZE_FLAT_DEVICE_HIERARCHY=COMPOSITE", b[] = "EnableRecoverablePageFaults=0"; - static char c[] = "DirectSubmissionOverrideBlitterSupport=0", *const apply[] = {a, b, c}; - if ((1 & c_dbcsr_acc_opencl_config.wa) && NULL == getenv("ZE_FLAT_DEVICE_HIERARCHY")) { - ACC_OPENCL_EXPECT(0 == LIBXSMM_PUTENV(apply[0])); - } -# if (1 >= ACC_OPENCL_USM) - if ((2 & c_dbcsr_acc_opencl_config.wa) && NULL == getenv("EnableRecoverablePageFaults")) { - ACC_OPENCL_EXPECT(0 == LIBXSMM_PUTENV(apply[1])); - } -# endif - if ((4 & c_dbcsr_acc_opencl_config.wa) && NULL == getenv("DirectSubmissionOverrideBlitterSupport")) { - ACC_OPENCL_EXPECT(0 == LIBXSMM_PUTENV(apply[2])); - } - } - if (0 != c_dbcsr_acc_opencl_config.debug && NULL == getenv("DisableScratchPages")) { - static char a[] = "DisableScratchPages=1", *const apply[] = {a}; - ACC_OPENCL_EXPECT(0 == LIBXSMM_PUTENV(apply[0])); - } - } -} - - -int c_dbcsr_acc_init(void) { -# if defined(_OPENMP) - /* initialization/finalization is not meant to be thread-safe */ - int result = ((0 == omp_in_parallel() || /*main*/ 0 == omp_get_thread_num()) ? EXIT_SUCCESS : EXIT_FAILURE); -# else - int result = EXIT_SUCCESS; -# endif -# if defined(ACC_OPENCL_PROFILE_DBCSR) - int routine_handle; - if (NULL == c_dbcsr_acc_opencl_config.lock_main) { /* avoid to configure multiple times */ - c_dbcsr_acc_opencl_configure(); - } - if (0 != c_dbcsr_acc_opencl_config.profile) { - static const char* routine_name_ptr = LIBXSMM_FUNCNAME + ACC_OPENCL_PROFILE_DBCSR; - static const int routine_name_len = (int)sizeof(LIBXSMM_FUNCNAME) - (ACC_OPENCL_PROFILE_DBCSR + 1); - c_dbcsr_timeset((const char**)&routine_name_ptr, &routine_name_len, &routine_handle); - } -# else - if (NULL == c_dbcsr_acc_opencl_config.lock_main) { /* avoid to configure multiple times */ - c_dbcsr_acc_opencl_configure(); - } -# endif - /* eventually touch OpenCL/compute runtime after configure */ - if (0 == c_dbcsr_acc_opencl_config.ndevices && EXIT_SUCCESS == result) { /* avoid to initialize multiple times */ - char buffer[ACC_OPENCL_BUFFERSIZE]; - cl_platform_id platforms[ACC_OPENCL_MAXNDEVS] = {NULL}; - cl_device_id devices[ACC_OPENCL_MAXNDEVS]; - cl_device_type type = CL_DEVICE_TYPE_ALL; - cl_uint nplatforms = 0, ndevices = 0, i; - const char* const env_devmatch = getenv("ACC_OPENCL_DEVMATCH"); - const char* const env_devtype = getenv("ACC_OPENCL_DEVTYPE"); - const char* const env_device = getenv("ACC_OPENCL_DEVICE"); - char* const env_devids = getenv("ACC_OPENCL_DEVIDS"); - int device_id = (NULL == env_device ? 0 : atoi(env_device)); -# if defined(ACC_OPENCL_CACHE_DID) - assert(0 == c_dbcsr_acc_opencl_active_id); -# endif - if (EXIT_SUCCESS != c_dbcsr_acc_opencl_device_uid(NULL /*device*/, env_devmatch, &c_dbcsr_acc_opencl_config.devmatch)) { - c_dbcsr_acc_opencl_config.devmatch = 1; - } - if (EXIT_SUCCESS == clGetPlatformIDs(0, NULL, &nplatforms) && 0 < nplatforms) { - ACC_OPENCL_CHECK(result, clGetPlatformIDs(nplatforms <= ACC_OPENCL_MAXNDEVS ? nplatforms : ACC_OPENCL_MAXNDEVS, platforms, 0), - "retrieve platform ids"); - } - if (EXIT_SUCCESS == result) { - if (NULL != env_devtype && '\0' != *env_devtype) { - if (NULL != LIBXSMM_STRISTR(env_devtype, "gpu")) { - type = CL_DEVICE_TYPE_GPU; - } - else if (NULL != LIBXSMM_STRISTR(env_devtype, "cpu")) { - type = CL_DEVICE_TYPE_CPU; - } - else if (NULL != LIBXSMM_STRISTR(env_devtype, "acc") || NULL != LIBXSMM_STRISTR(env_devtype, "other")) { - type = CL_DEVICE_TYPE_ACCELERATOR; - } - else { - type = CL_DEVICE_TYPE_ALL; - } - } - c_dbcsr_acc_opencl_config.ndevices = 0; - for (i = 0; i < nplatforms; ++i) { - if (EXIT_SUCCESS == clGetDeviceIDs(platforms[i], type, 0, NULL, &ndevices) && 0 < ndevices) { - ACC_OPENCL_CHECK(result, clGetDeviceIDs(platforms[i], type, ndevices, devices, NULL), "retrieve device ids"); - if (EXIT_SUCCESS == result) { - cl_uint j = 0; - for (; j < ndevices; ++j) { -# if defined(CL_VERSION_1_2) - cl_device_partition_property properties[] = { - CL_DEVICE_PARTITION_BY_AFFINITY_DOMAIN, CL_DEVICE_AFFINITY_DOMAIN_NUMA, /*terminator*/ 0}; - cl_uint nunits = 0, n = 0; - if ((1 < c_dbcsr_acc_opencl_config.devsplit || 0 > c_dbcsr_acc_opencl_config.devsplit) && - /* Intel CPU (e.g., out of two sockets) yields thread-count of both sockets */ - EXIT_SUCCESS == clGetDeviceInfo(devices[j], CL_DEVICE_MAX_COMPUTE_UNITS, sizeof(cl_uint), &nunits, NULL) && - 1 < nunits) - { - n = LIBXSMM_MIN(1 < c_dbcsr_acc_opencl_config.devsplit ? (cl_uint)c_dbcsr_acc_opencl_config.devsplit : nunits, - ACC_OPENCL_MAXNDEVS); - properties[0] = CL_DEVICE_PARTITION_EQUALLY; - properties[1] = (nunits + n - 1) / n; - } - if (0 == c_dbcsr_acc_opencl_config.devsplit || 1 == c_dbcsr_acc_opencl_config.devsplit || - (c_dbcsr_acc_opencl_config.ndevices + 1) == ACC_OPENCL_MAXNDEVS || - EXIT_SUCCESS != clCreateSubDevices(devices[j], properties, 0, NULL, &n)) -# endif - { - c_dbcsr_acc_opencl_config.devices[c_dbcsr_acc_opencl_config.ndevices] = devices[j]; - ++c_dbcsr_acc_opencl_config.ndevices; - } -# if defined(CL_VERSION_1_2) - else if (1 < n) { /* create subdevices */ - if (ACC_OPENCL_MAXNDEVS < (c_dbcsr_acc_opencl_config.ndevices + n)) { - n = (cl_uint)ACC_OPENCL_MAXNDEVS - c_dbcsr_acc_opencl_config.ndevices; - } - if (EXIT_SUCCESS == clCreateSubDevices(devices[j], properties, n, - c_dbcsr_acc_opencl_config.devices + c_dbcsr_acc_opencl_config.ndevices, NULL)) - { - ACC_OPENCL_CHECK(result, clReleaseDevice(devices[j]), "release device"); - c_dbcsr_acc_opencl_config.ndevices += n; - } - else break; - } - else { - c_dbcsr_acc_opencl_config.devices[c_dbcsr_acc_opencl_config.ndevices] = devices[j]; - ++c_dbcsr_acc_opencl_config.ndevices; - } -# endif - } - } /*else break;*/ - } - } - } - if (EXIT_SUCCESS == result && 0 < c_dbcsr_acc_opencl_config.ndevices) { - const char* const env_vendor = getenv("ACC_OPENCL_VENDOR"); - /* filter device by vendor (if requested) */ - if (NULL != env_vendor && '\0' != *env_vendor) { - for (i = 0; (int)i < c_dbcsr_acc_opencl_config.ndevices;) { - if (EXIT_SUCCESS == - clGetDeviceInfo(c_dbcsr_acc_opencl_config.devices[i], CL_DEVICE_VENDOR, ACC_OPENCL_BUFFERSIZE, buffer, NULL)) - { - if (NULL == LIBXSMM_STRISTR(buffer, env_vendor)) { -# if defined(CL_VERSION_1_2) - ACC_OPENCL_EXPECT(EXIT_SUCCESS == clReleaseDevice(c_dbcsr_acc_opencl_config.devices[i])); -# endif - --c_dbcsr_acc_opencl_config.ndevices; - if ((int)i < c_dbcsr_acc_opencl_config.ndevices) { /* keep original order (stable) */ - memmove(&c_dbcsr_acc_opencl_config.devices[i], &c_dbcsr_acc_opencl_config.devices[i + 1], - sizeof(cl_device_id) * (c_dbcsr_acc_opencl_config.ndevices - i)); - } - } - else ++i; - } - else break; /* error: retrieving device vendor */ - } - } - /* reorder devices according to c_dbcsr_acc_opencl_order_devices */ - if (EXIT_SUCCESS == result && 1 < c_dbcsr_acc_opencl_config.ndevices) { - qsort(c_dbcsr_acc_opencl_config.devices, c_dbcsr_acc_opencl_config.ndevices, sizeof(cl_device_id), - c_dbcsr_acc_opencl_order_devices); - } - /* ACC_OPENCL_DEVIDS is parsed as a list of devices (whitelist) */ - if (EXIT_SUCCESS == result && NULL != env_devids && '\0' != *env_devids) { - cl_uint devids[ACC_OPENCL_MAXNDEVS], ndevids = 0; - char* did = strtok(env_devids, ACC_OPENCL_DELIMS " "); - for (; NULL != did && ndevids < ACC_OPENCL_MAXNDEVS; did = strtok(NULL, ACC_OPENCL_DELIMS " ")) { - const int id = atoi(did); - if (0 <= id && id < c_dbcsr_acc_opencl_config.ndevices) devids[ndevids++] = id; - } - if (0 < ndevids) { - ndevices = (cl_uint)c_dbcsr_acc_opencl_config.ndevices; - for (i = 0; i < ndevices; ++i) { - cl_uint match = 0, j = 0; - do - if (i == devids[j]) { - match = 1; - break; - } - while (++j < ndevids); - if (0 == match) { -# if defined(CL_VERSION_1_2) - ACC_OPENCL_EXPECT(EXIT_SUCCESS == clReleaseDevice(c_dbcsr_acc_opencl_config.devices[i])); -# endif - c_dbcsr_acc_opencl_config.devices[i] = NULL; - } - } - for (i = c_dbcsr_acc_opencl_config.ndevices - 1;; --i) { - if (NULL == c_dbcsr_acc_opencl_config.devices[i]) { /* keep original order (stable) */ - const cl_uint nmove = c_dbcsr_acc_opencl_config.ndevices - (i + 1); - if (0 < nmove) { - memmove( - &c_dbcsr_acc_opencl_config.devices[i], &c_dbcsr_acc_opencl_config.devices[i + 1], sizeof(cl_device_id) * nmove); - } - --c_dbcsr_acc_opencl_config.ndevices; - } - if (0 == i) break; - } - } - } - } - if (EXIT_SUCCESS == result && 0 < c_dbcsr_acc_opencl_config.ndevices) { - /* preselect any default device or prune to homogeneous set of devices */ - if (NULL == env_device || '\0' == *env_device) { - char tmp[ACC_OPENCL_BUFFERSIZE] = ""; - ndevices = (cl_uint)c_dbcsr_acc_opencl_config.ndevices; - for (i = 0; i < ndevices; ++i) { - cl_device_type itype; - result = clGetDeviceInfo(c_dbcsr_acc_opencl_config.devices[i], CL_DEVICE_TYPE, sizeof(cl_device_type), &itype, NULL); - if (EXIT_SUCCESS == result) { - if (0 != (CL_DEVICE_TYPE_DEFAULT & itype)) { - if (0 < i) { - c_dbcsr_acc_opencl_config.devices[0] = c_dbcsr_acc_opencl_config.devices[i]; - } - c_dbcsr_acc_opencl_config.ndevices = 1; - device_id = 0; - break; - } - else if (CL_DEVICE_TYPE_ALL == type && NULL == env_devtype /*&& CL_DEVICE_TYPE_GPU == itype*/ && device_id <= (int)i) { - result = clGetDeviceInfo(c_dbcsr_acc_opencl_config.devices[i], CL_DEVICE_NAME, ACC_OPENCL_BUFFERSIZE, buffer, NULL); - if (EXIT_SUCCESS == result /* prune for homogeneous set of devices */ - && ('\0' == *tmp || 0 == strncmp(buffer, tmp, ACC_OPENCL_BUFFERSIZE))) - { - c_dbcsr_acc_opencl_config.ndevices = i + 1; - strncpy(tmp, buffer, ACC_OPENCL_BUFFERSIZE); - } - else break; /* error: retrieving device name */ - } - } - else break; /* error: retrieving device type */ - } - } - else { /* prune number of devices to only expose requested ID */ - if (1 < c_dbcsr_acc_opencl_config.ndevices) { - if (0 < device_id) { - c_dbcsr_acc_opencl_config.devices[0] = - c_dbcsr_acc_opencl_config.devices[device_id % c_dbcsr_acc_opencl_config.ndevices]; - } - c_dbcsr_acc_opencl_config.ndevices = 1; - } - device_id = 0; - } - } - if (device_id < c_dbcsr_acc_opencl_config.ndevices) { - if (EXIT_SUCCESS == result) { - const size_t nhandles = ACC_OPENCL_MAXNITEMS * c_dbcsr_acc_opencl_config.nthreads; - assert(0 < c_dbcsr_acc_opencl_config.ndevices); - assert(c_dbcsr_acc_opencl_config.ndevices < ACC_OPENCL_MAXNDEVS); - assert(NULL == c_dbcsr_acc_opencl_config.memptrs); - assert(NULL == c_dbcsr_acc_opencl_config.memptr_data); - assert(0 == c_dbcsr_acc_opencl_config.nmemptrs); - assert(NULL == c_dbcsr_acc_opencl_config.streams); - assert(NULL == c_dbcsr_acc_opencl_config.events); - assert(NULL == c_dbcsr_acc_opencl_config.stream_data); - assert(NULL == c_dbcsr_acc_opencl_config.event_data); - assert(0 == c_dbcsr_acc_opencl_config.nstreams); - assert(0 == c_dbcsr_acc_opencl_config.nevents); - /* allocate and initialize memptr registry */ - c_dbcsr_acc_opencl_config.nmemptrs = nhandles; - c_dbcsr_acc_opencl_config.memptrs = (c_dbcsr_acc_opencl_info_memptr_t**)malloc( - sizeof(c_dbcsr_acc_opencl_info_memptr_t*) * nhandles); - c_dbcsr_acc_opencl_config.memptr_data = (c_dbcsr_acc_opencl_info_memptr_t*)malloc( - sizeof(c_dbcsr_acc_opencl_info_memptr_t) * nhandles); - if (NULL != c_dbcsr_acc_opencl_config.memptrs && NULL != c_dbcsr_acc_opencl_config.memptr_data) { - c_dbcsr_acc_opencl_pmalloc_init(sizeof(c_dbcsr_acc_opencl_info_memptr_t), &c_dbcsr_acc_opencl_config.nmemptrs, - (void**)c_dbcsr_acc_opencl_config.memptrs, c_dbcsr_acc_opencl_config.memptr_data); - } - else { - free(c_dbcsr_acc_opencl_config.memptrs); - free(c_dbcsr_acc_opencl_config.memptr_data); - c_dbcsr_acc_opencl_config.memptr_data = NULL; - c_dbcsr_acc_opencl_config.memptrs = NULL; - c_dbcsr_acc_opencl_config.nmemptrs = 0; - result = EXIT_FAILURE; - } - /* allocate and initialize streams registry */ - c_dbcsr_acc_opencl_config.nstreams = nhandles; - c_dbcsr_acc_opencl_config.streams = (c_dbcsr_acc_opencl_stream_t**)malloc(sizeof(c_dbcsr_acc_opencl_stream_t*) * nhandles); - c_dbcsr_acc_opencl_config.stream_data = (c_dbcsr_acc_opencl_stream_t*)malloc( - sizeof(c_dbcsr_acc_opencl_stream_t) * nhandles); - if (NULL != c_dbcsr_acc_opencl_config.streams && NULL != c_dbcsr_acc_opencl_config.stream_data) { - c_dbcsr_acc_opencl_pmalloc_init(sizeof(c_dbcsr_acc_opencl_stream_t), &c_dbcsr_acc_opencl_config.nstreams, - (void**)c_dbcsr_acc_opencl_config.streams, c_dbcsr_acc_opencl_config.stream_data); - } - else { - free(c_dbcsr_acc_opencl_config.streams); - free(c_dbcsr_acc_opencl_config.stream_data); - c_dbcsr_acc_opencl_config.stream_data = NULL; - c_dbcsr_acc_opencl_config.streams = NULL; - c_dbcsr_acc_opencl_config.nstreams = 0; - result = EXIT_FAILURE; - } - /* allocate and initialize events registry */ - c_dbcsr_acc_opencl_config.nevents = nhandles; - c_dbcsr_acc_opencl_config.events = (cl_event**)malloc(sizeof(cl_event*) * nhandles); - c_dbcsr_acc_opencl_config.event_data = (cl_event*)malloc(sizeof(cl_event) * nhandles); - if (NULL != c_dbcsr_acc_opencl_config.events && NULL != c_dbcsr_acc_opencl_config.event_data) { - c_dbcsr_acc_opencl_pmalloc_init(sizeof(cl_event*), &c_dbcsr_acc_opencl_config.nevents, - (void**)c_dbcsr_acc_opencl_config.events, c_dbcsr_acc_opencl_config.event_data); - } - else { - free(c_dbcsr_acc_opencl_config.events); - free(c_dbcsr_acc_opencl_config.event_data); - c_dbcsr_acc_opencl_config.event_data = NULL; - c_dbcsr_acc_opencl_config.events = NULL; - c_dbcsr_acc_opencl_config.nevents = 0; - result = EXIT_FAILURE; - } - if ( -# if defined(ACC_OPENCL_PROFILE_DBCSR) - 2 <= c_dbcsr_acc_opencl_config.profile || -# else - 1 <= c_dbcsr_acc_opencl_config.profile || -# endif - 0 > c_dbcsr_acc_opencl_config.profile) - { - const char* const env_qsize = getenv("ACC_OPENCL_PROFILE_QSIZE"); - const int psize = (NULL == env_qsize ? 0 : atoi(env_qsize)); - const int qsize = (0 >= psize ? 1024 : LIBXSMM_MIN(psize, 65536)); - const int profile = LIBXSMM_MAX(LIBXSMM_ABS(c_dbcsr_acc_opencl_config.profile), 2); - const c_dbcsr_acc_opencl_hist_update_fn update[] = {c_dbcsr_acc_opencl_hist_avg, c_dbcsr_acc_opencl_hist_add}; - c_dbcsr_acc_opencl_hist_create(&c_dbcsr_acc_opencl_config.hist_h2d, profile + 1, qsize, 2, update); - c_dbcsr_acc_opencl_hist_create(&c_dbcsr_acc_opencl_config.hist_d2h, profile + 1, qsize, 2, update); - c_dbcsr_acc_opencl_hist_create(&c_dbcsr_acc_opencl_config.hist_d2d, profile + 1, qsize, 2, update); - } - else { - assert(NULL == c_dbcsr_acc_opencl_config.hist_h2d); - assert(NULL == c_dbcsr_acc_opencl_config.hist_d2h); - assert(NULL == c_dbcsr_acc_opencl_config.hist_d2d); - } - if (EXIT_SUCCESS == result) { /* lastly, print active device and list of devices */ -# if defined(ACC_OPENCL_ACTIVATE) - if (0 <= ACC_OPENCL_ACTIVATE && ACC_OPENCL_ACTIVATE < c_dbcsr_acc_opencl_config.ndevices) { - result = c_dbcsr_acc_opencl_set_active_device(NULL /*lock*/, ACC_OPENCL_ACTIVATE); - } - else { - if (0 < c_dbcsr_acc_opencl_config.nrank && 1 < c_dbcsr_acc_opencl_config.ndevices) { - device_id = c_dbcsr_acc_opencl_config.nrank % c_dbcsr_acc_opencl_config.ndevices; - } - result = c_dbcsr_acc_opencl_set_active_device(NULL /*lock*/, device_id); - } -# else - c_dbcsr_acc_opencl_config.device_id = device_id; -# endif - if ((2 <= c_dbcsr_acc_opencl_config.verbosity || 0 > c_dbcsr_acc_opencl_config.verbosity) && - (0 == c_dbcsr_acc_opencl_config.nrank)) - { - char platform_name[ACC_OPENCL_BUFFERSIZE]; - for (i = 0; i < (cl_uint)c_dbcsr_acc_opencl_config.ndevices; ++i) { - if (EXIT_SUCCESS == c_dbcsr_acc_opencl_device_name(c_dbcsr_acc_opencl_config.devices[i], buffer, - ACC_OPENCL_BUFFERSIZE, platform_name, ACC_OPENCL_BUFFERSIZE, /*cleanup*/ 0)) - { - fprintf(stderr, "INFO ACC/OpenCL: DEVICE -> \"%s : %s\" (%u)\n", platform_name, buffer, i); - } - } - } - } - } - } - else { /* mark as initialized */ - c_dbcsr_acc_opencl_config.ndevices = -1; - } -# if defined(__DBCSR_ACC) - /* DBCSR shall call c_dbcsr_acc_init as well as libsmm_acc_init (since both interfaces are used). - * Also, libsmm_acc_init may privately call c_dbcsr_acc_init (as it depends on the ACC interface). - * The implementation of c_dbcsr_acc_init should hence be safe against "over initialization". - * However, DBCSR only calls c_dbcsr_acc_init (and expects an implicit libsmm_acc_init). - */ - if (EXIT_SUCCESS == result) result = libsmm_acc_init(); -# endif - } -# if defined(ACC_OPENCL_PROFILE_DBCSR) - if (0 != c_dbcsr_acc_opencl_config.profile) c_dbcsr_timestop(&routine_handle); -# endif - ACC_OPENCL_RETURN(result); -} - - -/* attempt to automatically initialize backend */ -LIBXSMM_ATTRIBUTE_CTOR void c_dbcsr_acc_opencl_init(void) { - if (NULL == c_dbcsr_acc_opencl_config.lock_main) { /* avoid to configure multiple times */ - c_dbcsr_acc_opencl_configure(); - } -# if defined(ACC_OPENCL_PREINIT) - ACC_OPENCL_EXPECT(EXIT_SUCCESS == c_dbcsr_acc_init()); -# endif -} - - -/* attempt to automatically finalize backend */ -LIBXSMM_ATTRIBUTE_DTOR void c_dbcsr_acc_opencl_finalize(void) { - assert(c_dbcsr_acc_opencl_config.ndevices < ACC_OPENCL_MAXNDEVS); - if (0 != c_dbcsr_acc_opencl_config.ndevices) { - const int precision[] = {0, 1}; - int i; - LIBXSMM_STDIO_ACQUIRE(); - c_dbcsr_acc_opencl_hist_print(stderr, c_dbcsr_acc_opencl_config.hist_h2d, "\nPROF ACC/OpenCL: H2D", precision, NULL /*adjust*/); - c_dbcsr_acc_opencl_hist_print(stderr, c_dbcsr_acc_opencl_config.hist_d2h, "\nPROF ACC/OpenCL: D2H", precision, NULL /*adjust*/); - c_dbcsr_acc_opencl_hist_print(stderr, c_dbcsr_acc_opencl_config.hist_d2d, "\nPROF ACC/OpenCL: D2D", precision, NULL /*adjust*/); - LIBXSMM_STDIO_RELEASE(); - for (i = 0; i < ACC_OPENCL_MAXNDEVS; ++i) { - const cl_device_id device_id = c_dbcsr_acc_opencl_config.devices[i]; - if (NULL != device_id) { -# if defined(CL_VERSION_1_2) && 0 /* avoid potential segfault */ - ACC_OPENCL_EXPECT(EXIT_SUCCESS == clReleaseDevice(device_id)); -# endif - } - } - if (NULL != c_dbcsr_acc_opencl_config.device.stream.queue) { /* release private stream */ - clReleaseCommandQueue(c_dbcsr_acc_opencl_config.device.stream.queue); /* ignore return code */ - } - if (NULL != c_dbcsr_acc_opencl_config.device.context) { - const cl_context context = c_dbcsr_acc_opencl_config.device.context; - c_dbcsr_acc_opencl_config.device.context = NULL; - clReleaseContext(context); /* ignore return code */ - } - for (i = 0; i < ACC_OPENCL_NLOCKS; ++i) { /* destroy locks */ - ACC_OPENCL_DESTROY((ACC_OPENCL_LOCKTYPE*)(c_dbcsr_acc_opencl_locks + ACC_OPENCL_CACHELINE * i)); - } - /* release/reset buffers */ - c_dbcsr_acc_opencl_hist_free(c_dbcsr_acc_opencl_config.hist_h2d); - c_dbcsr_acc_opencl_hist_free(c_dbcsr_acc_opencl_config.hist_d2h); - c_dbcsr_acc_opencl_hist_free(c_dbcsr_acc_opencl_config.hist_d2d); - free(c_dbcsr_acc_opencl_config.memptrs); - free(c_dbcsr_acc_opencl_config.memptr_data); - free(c_dbcsr_acc_opencl_config.streams); - free(c_dbcsr_acc_opencl_config.stream_data); - free(c_dbcsr_acc_opencl_config.events); - free(c_dbcsr_acc_opencl_config.event_data); - /* clear entire configuration structure */ - memset(&c_dbcsr_acc_opencl_config, 0, sizeof(c_dbcsr_acc_opencl_config)); -# if defined(ACC_OPENCL_CACHE_DID) - c_dbcsr_acc_opencl_active_id = 0; /* reset cached active device-ID */ -# endif - libxsmm_finalize(); - } -} - - -int c_dbcsr_acc_finalize(void) { -# if defined(_OPENMP) - /* initialization/finalization is not meant to be thread-safe */ - int result = ((0 == omp_in_parallel() || /*main*/ 0 == omp_get_thread_num()) ? EXIT_SUCCESS : EXIT_FAILURE); -# else - int result = EXIT_SUCCESS; -# endif - static void (*cleanup)(void) = c_dbcsr_acc_opencl_finalize; -# if defined(ACC_OPENCL_PROFILE_DBCSR) - int routine_handle; - if (0 != c_dbcsr_acc_opencl_config.profile) { - static const char* routine_name_ptr = LIBXSMM_FUNCNAME + ACC_OPENCL_PROFILE_DBCSR; - static const int routine_name_len = (int)sizeof(LIBXSMM_FUNCNAME) - (ACC_OPENCL_PROFILE_DBCSR + 1); - c_dbcsr_timeset((const char**)&routine_name_ptr, &routine_name_len, &routine_handle); - } -# endif - assert(c_dbcsr_acc_opencl_config.ndevices < ACC_OPENCL_MAXNDEVS); - if (0 != c_dbcsr_acc_opencl_config.ndevices && NULL != cleanup) { -# if defined(__DBCSR_ACC) - /* DBCSR may call c_dbcsr_acc_init as well as libsmm_acc_init() since both interface are used. - * libsmm_acc_init may privately call c_dbcsr_acc_init (as it depends on the ACC interface). - * The implementation of c_dbcsr_acc_init should be safe against "over initialization". - * However, DBCSR only calls c_dbcsr_acc_init and expects an implicit libsmm_acc_init(). - */ - if (EXIT_SUCCESS == result) result = libsmm_acc_finalize(); -# endif - if (EXIT_SUCCESS == result) result = atexit(cleanup); - cleanup = NULL; - } -# if defined(ACC_OPENCL_PROFILE_DBCSR) - if (0 != c_dbcsr_acc_opencl_config.profile) c_dbcsr_timestop(&routine_handle); -# endif - ACC_OPENCL_RETURN(result); -} - - -int c_dbcsr_acc_opencl_use_cmem(const c_dbcsr_acc_opencl_device_t* devinfo) { -# if defined(ACC_OPENCL_CMEM) - return (0 != devinfo->size_maxalloc && devinfo->size_maxalloc <= devinfo->size_maxcmem) ? EXIT_SUCCESS : EXIT_FAILURE; -# else - return EXIT_FAILURE; -# endif -} - - -void c_dbcsr_acc_clear_errors(void) {} - - -int c_dbcsr_acc_get_ndevices(int* ndevices) { - int result; -# if defined(ACC_OPENCL_PROFILE_DBCSR) - int routine_handle; - if (0 != c_dbcsr_acc_opencl_config.profile) { - static const char* routine_name_ptr = LIBXSMM_FUNCNAME + ACC_OPENCL_PROFILE_DBCSR; - static const int routine_name_len = (int)sizeof(LIBXSMM_FUNCNAME) - (ACC_OPENCL_PROFILE_DBCSR + 1); - c_dbcsr_timeset((const char**)&routine_name_ptr, &routine_name_len, &routine_handle); - } -# endif -# if defined(__DBCSR_ACC) /* lazy initialization */ - /* DBCSR calls c_dbcsr_acc_get_ndevices before calling c_dbcsr_acc_init. */ - result = c_dbcsr_acc_init(); - if (EXIT_SUCCESS == result) -# endif - { - if (NULL != ndevices && 0 != c_dbcsr_acc_opencl_config.ndevices) { - *ndevices = (0 < c_dbcsr_acc_opencl_config.ndevices ? c_dbcsr_acc_opencl_config.ndevices : 0); - result = EXIT_SUCCESS; - } - else result = EXIT_FAILURE; - } -# if defined(ACC_OPENCL_PROFILE_DBCSR) - if (0 != c_dbcsr_acc_opencl_config.profile) c_dbcsr_timestop(&routine_handle); -# endif - ACC_OPENCL_RETURN(result); -} - - -int c_dbcsr_acc_opencl_device_id(cl_device_id device, int* device_id, int* global_id) { - int result = EXIT_SUCCESS, i; - assert(c_dbcsr_acc_opencl_config.ndevices < ACC_OPENCL_MAXNDEVS); - assert(NULL != device_id || NULL != global_id); - for (i = 0; i < c_dbcsr_acc_opencl_config.ndevices; ++i) { - if (device == c_dbcsr_acc_opencl_config.devices[i]) break; - } - if (i < c_dbcsr_acc_opencl_config.ndevices) { - if (NULL != device_id) *device_id = i; - if (NULL != global_id) { - *global_id = i; - for (++i; i < ACC_OPENCL_MAXNDEVS; ++i) { - if (NULL != c_dbcsr_acc_opencl_config.devices[i]) { - if (device == c_dbcsr_acc_opencl_config.devices[i]) { - *global_id = i; - break; - } - } - else break; - } - } - } - else { - if (NULL != device_id) *device_id = -1; - if (NULL != global_id) *global_id = -1; - if (NULL != device) result = EXIT_FAILURE; - } - return result; -} - - -int c_dbcsr_acc_opencl_device_vendor(cl_device_id device, const char vendor[], int use_platform_name) { - char buffer[ACC_OPENCL_BUFFERSIZE]; - int result = EXIT_SUCCESS; - assert(NULL != device && NULL != vendor); - if (0 == use_platform_name) { - result = clGetDeviceInfo(device, CL_DEVICE_VENDOR, ACC_OPENCL_BUFFERSIZE, buffer, NULL); - } - else { - cl_platform_id platform; - result = clGetDeviceInfo(device, CL_DEVICE_PLATFORM, sizeof(cl_platform_id), &platform, NULL); - if (EXIT_SUCCESS == result) { - result = clGetPlatformInfo( - platform, 1 == use_platform_name ? CL_PLATFORM_NAME : CL_PLATFORM_VENDOR, ACC_OPENCL_BUFFERSIZE, buffer, NULL); - } - } - if (EXIT_SUCCESS == result) { - result = (NULL != LIBXSMM_STRISTR(buffer, vendor) ? EXIT_SUCCESS : EXIT_FAILURE); - } - return result; -} - - -int c_dbcsr_acc_opencl_device_uid(cl_device_id device, const char devname[], unsigned int* uid) { - int result; - if (NULL != uid) { - if (NULL != device && EXIT_SUCCESS == c_dbcsr_acc_opencl_device_vendor(device, "intel", 0 /*use_platform_name*/)) { - result = clGetDeviceInfo(device, 0x4251 /*CL_DEVICE_ID_INTEL*/, sizeof(unsigned int), uid, NULL); - } - else result = EXIT_FAILURE; - if (EXIT_SUCCESS != result) { - if (NULL != devname && '\0' != *devname) { - *uid = (unsigned int)strtoul(devname, NULL, 0); - if (0 == *uid) { - const char *const begin = strrchr(devname, '['), *const end = strrchr(devname, ']'); - if (NULL != begin && begin < end) { - *uid = (unsigned int)strtoul(begin + 1, NULL, 0); - } - if (0 == *uid) { - const size_t size = strlen(devname); - const unsigned int hash = libxsmm_hash(devname, (unsigned int)size, 25071975 /*seed*/); - *uid = libxsmm_hash(&hash, 4 /*size*/, hash >> 16 /*seed*/) & 0xFFFF; - } - } - result = EXIT_SUCCESS; - } - else { - result = EXIT_FAILURE; - *uid = 0; - } - } - } - else result = EXIT_FAILURE; - return result; -} - - -int c_dbcsr_acc_opencl_device_name( - cl_device_id device, char name[], size_t name_maxlen, char platform[], size_t platform_maxlen, int cleanup) { - int result_name = 0, result_platform = 0; - assert(NULL != name || NULL != platform); - if (NULL == device && 0 < c_dbcsr_acc_opencl_config.ndevices) { - device = c_dbcsr_acc_opencl_config.devices[0]; /* NULL-device refers to device 0 */ - } - if (NULL != name && 0 != name_maxlen) { - result_name = clGetDeviceInfo(device, CL_DEVICE_NAME, name_maxlen, name, NULL); - if (0 != cleanup && EXIT_SUCCESS == result_name) { - char* const part = strchr(name, ':'); - if (NULL != part) *part = '\0'; - } - } - if (NULL != platform && 0 != platform_maxlen) { - cl_platform_id platform_id; - result_platform = clGetDeviceInfo(device, CL_DEVICE_PLATFORM, sizeof(cl_platform_id), &platform_id, NULL); - if (EXIT_SUCCESS == result_platform) { - result_platform = clGetPlatformInfo(platform_id, CL_PLATFORM_NAME, platform_maxlen, platform, NULL); - } - } - return result_name | result_platform; -} - - -int c_dbcsr_acc_opencl_device_level( - cl_device_id device, int std_clevel[2], int std_level[2], char std_flag[16], cl_device_type* type) { - char buffer[ACC_OPENCL_BUFFERSIZE]; - unsigned int std_clevel_uint[2] = {0}, std_level_uint[2] = {0}; - int result = EXIT_SUCCESS; - assert(NULL != device && (NULL != std_clevel || NULL != std_level || NULL != std_flag || NULL != type)); - result = clGetDeviceInfo(device, CL_DEVICE_OPENCL_C_VERSION, ACC_OPENCL_BUFFERSIZE / 2, buffer, NULL); - if (EXIT_SUCCESS == result && (NULL != std_clevel || NULL != std_flag)) { - if (2 == sscanf(buffer, "OpenCL C %u.%u", std_clevel_uint, std_clevel_uint + 1)) { - std_clevel[0] = (int)std_clevel_uint[0]; - std_clevel[1] = (int)std_clevel_uint[1]; - } - else result = EXIT_FAILURE; - } - if (EXIT_SUCCESS == result && (NULL != std_level || NULL != std_flag)) { - result = clGetDeviceInfo( - device, CL_DEVICE_VERSION, ACC_OPENCL_BUFFERSIZE - ACC_OPENCL_BUFFERSIZE / 2, buffer + ACC_OPENCL_BUFFERSIZE / 2, NULL); - if (EXIT_SUCCESS == result) { - if (2 == sscanf(buffer + ACC_OPENCL_BUFFERSIZE / 2, "OpenCL %u.%u", std_level_uint, std_level_uint + 1)) { - std_level[0] = (int)std_level_uint[0]; - std_level[1] = (int)std_level_uint[1]; - } - else result = EXIT_FAILURE; - } - } - if (EXIT_SUCCESS == result && NULL != std_flag) { - if (2 <= std_level_uint[0]) { - const int nchar = LIBXSMM_SNPRINTF(std_flag, 16, "-cl-std=CL%u.0", std_level_uint[0]); - if (0 >= nchar || 16 <= nchar) result = EXIT_FAILURE; - } - else if (1 <= std_level_uint[0]) { - if (1 <= std_level_uint[1]) { - const int nchar = LIBXSMM_SNPRINTF(std_flag, 16, "-cl-std=CL%u.%u", std_level_uint[0], std_level_uint[1]); - if (0 >= nchar || 16 <= nchar) result = EXIT_FAILURE; - } - else if (1 <= std_clevel_uint[0]) { /* fallback */ - const int nchar = LIBXSMM_SNPRINTF(std_flag, 16, "-cl-std=CL%u.%u", std_clevel_uint[0], std_clevel_uint[1]); - if (0 >= nchar || 16 <= nchar) result = EXIT_FAILURE; - } - else *std_flag = '\0'; /* not an error */ - } - else *std_flag = '\0'; /* not an error */ - } - if (EXIT_SUCCESS == result && NULL != type) { - result = clGetDeviceInfo(device, CL_DEVICE_TYPE, sizeof(cl_device_type), type, NULL); - } - if (EXIT_SUCCESS != result) { - if (NULL != std_clevel) std_clevel[0] = std_clevel[1] = 0; - if (NULL != std_level) std_level[0] = std_level[1] = 0; - if (NULL != std_flag) *std_flag = '\0'; - if (NULL != type) *type = 0; - } - return result; -} - - -int c_dbcsr_acc_opencl_device_ext(cl_device_id device, const char* const extnames[], int num_exts) { - int result = ((NULL != extnames && 0 < num_exts) ? EXIT_SUCCESS : EXIT_FAILURE); - char extensions[ACC_OPENCL_BUFFERSIZE], buffer[ACC_OPENCL_BUFFERSIZE]; - assert(NULL != device); - ACC_OPENCL_CHECK( - result, clGetDeviceInfo(device, CL_DEVICE_EXTENSIONS, ACC_OPENCL_BUFFERSIZE, extensions, NULL), "retrieve device extensions"); - if (EXIT_SUCCESS == result) { - do { - if (NULL != extnames[--num_exts]) { - const char* const end = buffer + strlen(extnames[num_exts]); /* before strtok */ - char* ext = strtok(strncpy(buffer, extnames[num_exts], ACC_OPENCL_BUFFERSIZE - 1), ACC_OPENCL_DELIMS " \t"); - for (; NULL != ext; ext = ((ext + 1) < end ? strtok((ext + 1) + strlen(ext), ACC_OPENCL_DELIMS " \t") : NULL)) { - if (NULL == strstr(extensions, ext)) { - return EXIT_FAILURE; - } - } - } - } while (0 < num_exts); - } - return result; -} - - -int c_dbcsr_acc_opencl_create_context(cl_device_id active_id, cl_context* context) { - cl_platform_id platform = NULL; - int result; - assert(0 < c_dbcsr_acc_opencl_config.ndevices); - assert(NULL != active_id && NULL != context); - result = clGetDeviceInfo(active_id, CL_DEVICE_PLATFORM, sizeof(cl_platform_id), &platform, NULL); - assert(EXIT_SUCCESS != result || NULL != platform); - if (EXIT_SUCCESS == result) { - void (*const notify)( - const char*, const void*, size_t, void*) = (0 != c_dbcsr_acc_opencl_config.verbosity ? c_dbcsr_acc_opencl_notify : NULL); - cl_context_properties properties[] = { - CL_CONTEXT_PLATFORM, 0 /*placeholder*/, 0 /* end of properties */ - }; - cl_context ctx = NULL; - properties[1] = (long)platform; - ctx = clCreateContext(properties, 1 /*num_devices*/, &active_id, notify, NULL /* user_data*/, &result); - if (EXIT_SUCCESS != result && CL_INVALID_DEVICE != result) { /* retry */ - ctx = clCreateContext(NULL /*properties*/, 1 /*num_devices*/, &active_id, notify, NULL /* user_data*/, &result); - } - if (EXIT_SUCCESS == result) { - assert(NULL != ctx); - *context = ctx; - if (0 != c_dbcsr_acc_opencl_config.verbosity) { - char buffer[ACC_OPENCL_BUFFERSIZE]; - int global_id = 0; - if (EXIT_SUCCESS == c_dbcsr_acc_opencl_device_name( - active_id, buffer, ACC_OPENCL_BUFFERSIZE, NULL /*platform*/, 0 /*platform_maxlen*/, /*cleanup*/ 1) && - EXIT_SUCCESS == c_dbcsr_acc_opencl_device_id(active_id, NULL /*devid*/, &global_id)) - { - const size_t size = strlen(buffer); - unsigned int uid[] = {0, 0}; - if ((EXIT_SUCCESS == c_dbcsr_acc_opencl_device_uid(NULL /*device*/, buffer, uid + 1)) && - (EXIT_SUCCESS == c_dbcsr_acc_opencl_device_uid(active_id, NULL /*devname*/, uid) || 0 != uid[1]) && uid[0] != uid[1]) - { - ACC_OPENCL_EXPECT(0 < LIBXSMM_SNPRINTF(buffer + size, LIBXSMM_MAX(0, ACC_OPENCL_BUFFERSIZE - size), " [0x%04x]", - 0 != uid[0] ? uid[0] : uid[1])); - } - fprintf(stderr, "INFO ACC/OpenCL: ndevices=%i device%i=\"%s\" context=%p pid=%u nthreads=%i\n", - c_dbcsr_acc_opencl_config.ndevices, global_id, buffer, (void*)ctx, libxsmm_get_pid(), - c_dbcsr_acc_opencl_config.nthreads); - } - } - } - else { - if (CL_INVALID_DEVICE == result && - EXIT_SUCCESS == c_dbcsr_acc_opencl_device_vendor(active_id, "nvidia", 0 /*use_platform_name*/)) - { - fprintf(stderr, "WARN ACC/OpenCL: if MPI-ranks target the same device in exclusive mode,\n" - " SMI must be used to enable sharing the device.\n"); - } - *context = NULL; - } - } - return result; -} - - -int c_dbcsr_acc_opencl_set_active_device(ACC_OPENCL_LOCKTYPE* lock, int device_id) { - c_dbcsr_acc_opencl_device_t* const devinfo = &c_dbcsr_acc_opencl_config.device; - int result = EXIT_SUCCESS; - assert(c_dbcsr_acc_opencl_config.ndevices < ACC_OPENCL_MAXNDEVS); - if (0 <= device_id && device_id < c_dbcsr_acc_opencl_config.ndevices) { - /* accessing devices is thread-safe (array is fixed after initialization) */ - const cl_device_id active_id = c_dbcsr_acc_opencl_config.devices[device_id]; - if (NULL != active_id) { - cl_context context = NULL; - if (NULL != lock) ACC_OPENCL_ACQUIRE(lock); - context = devinfo->context; - if (NULL != context) { - if (device_id != c_dbcsr_acc_opencl_config.device_id) { - const cl_device_id context_id = c_dbcsr_acc_opencl_config.devices[c_dbcsr_acc_opencl_config.device_id]; - assert(NULL != context_id); -# if defined(CL_VERSION_1_2) - ACC_OPENCL_EXPECT(EXIT_SUCCESS == clReleaseDevice(context_id)); -# endif - result = clReleaseContext(context); - context = NULL; - } - } - if (EXIT_SUCCESS == result && (NULL == devinfo->context || device_id != c_dbcsr_acc_opencl_config.device_id)) { - result = c_dbcsr_acc_opencl_create_context(active_id, &context); - assert(NULL != context || EXIT_SUCCESS != result); - } - /* update/cache device-specific information */ - if (EXIT_SUCCESS == result && (NULL == devinfo->context || device_id != c_dbcsr_acc_opencl_config.device_id)) { - if (NULL != devinfo->stream.queue) { /* release private stream */ - ACC_OPENCL_EXPECT(EXIT_SUCCESS == clReleaseCommandQueue(devinfo->stream.queue)); - } - memset(devinfo, 0, sizeof(*devinfo)); - result = c_dbcsr_acc_opencl_device_level( - active_id, devinfo->std_clevel, devinfo->std_level, devinfo->std_flag, &devinfo->type); - if (EXIT_SUCCESS == result) { - char devname[ACC_OPENCL_BUFFERSIZE] = ""; - const char* const sgexts[] = {"cl_intel_required_subgroup_size", "cl_intel_subgroups", "cl_khr_subgroups"}; - size_t sgsizes[16], nbytes = 0, i; - ACC_OPENCL_STREAM_PROPERTIES_TYPE properties[4] = { - CL_QUEUE_PROPERTIES, CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE, 0 /* terminator */ - }; - devinfo->intel = (EXIT_SUCCESS == c_dbcsr_acc_opencl_device_vendor(active_id, "intel", 0 /*use_platform_name*/)); - devinfo->nv = (EXIT_SUCCESS == c_dbcsr_acc_opencl_device_vendor(active_id, "nvidia", 0 /*use_platform_name*/)); - if (EXIT_SUCCESS != c_dbcsr_acc_opencl_device_name(active_id, devname, ACC_OPENCL_BUFFERSIZE, NULL /*platform*/, - 0 /*platform_maxlen*/, /*cleanup*/ 1) || - EXIT_SUCCESS != c_dbcsr_acc_opencl_device_uid(active_id, devname, &devinfo->uid)) - { - devinfo->uid = (cl_uint)-1; - } - if (EXIT_SUCCESS == c_dbcsr_acc_opencl_device_vendor(active_id, "amd", 0 /*use_platform_name*/) || - EXIT_SUCCESS == c_dbcsr_acc_opencl_device_vendor(active_id, "amd", 1 /*use_platform_name*/)) - { - devinfo->amd = 1; - if ('\0' != *devname) { - const char* const gfxname = LIBXSMM_STRISTR(devname, "gfx"); - if (NULL != gfxname && 90 <= atoi(gfxname + 3)) { - devinfo->amd = 2; - } - } - } - if (EXIT_SUCCESS != - clGetDeviceInfo(active_id, CL_DEVICE_HOST_UNIFIED_MEMORY, sizeof(cl_bool) /*cl_int*/, &devinfo->unified, NULL)) - { - devinfo->unified = CL_FALSE; - } - if (EXIT_SUCCESS != - clGetDeviceInfo(active_id, CL_DEVICE_MAX_MEM_ALLOC_SIZE, sizeof(cl_ulong), &devinfo->size_maxalloc, NULL)) - { - devinfo->size_maxalloc = 0; - } - if (EXIT_SUCCESS != - clGetDeviceInfo(active_id, CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE, sizeof(cl_ulong), &devinfo->size_maxcmem, NULL)) - { - devinfo->size_maxcmem = 0; - } - if (EXIT_SUCCESS != clGetDeviceInfo(active_id, CL_DEVICE_MAX_WORK_GROUP_SIZE, sizeof(size_t), devinfo->wgsize, NULL)) { - devinfo->wgsize[0] = 1; - } - if (EXIT_SUCCESS != clGetDeviceInfo(active_id, 4199 /*CL_DEVICE_PREFERRED_WORK_GROUP_SIZE_MULTIPLE*/, sizeof(size_t), - devinfo->wgsize + 1, NULL)) /* CL_VERSION_3_0 */ - { - devinfo->wgsize[1] = 1; - } - assert(0 == devinfo->wgsize[2]); - if (EXIT_SUCCESS == c_dbcsr_acc_opencl_device_ext(active_id, sgexts, 2) && 0 != devinfo->wgsize[1] && - EXIT_SUCCESS == - clGetDeviceInfo(active_id, 0x4108 /*CL_DEVICE_SUB_GROUP_SIZES_INTEL*/, sizeof(sgsizes), sgsizes, &nbytes)) - { - for (i = 0; (i * sizeof(size_t)) < nbytes; ++i) { - const size_t sgsize = sgsizes[i]; - if (devinfo->wgsize[2] < sgsize && (0 == (sgsize % devinfo->wgsize[1]) || 0 == (devinfo->wgsize[1] % sgsize))) { - if (devinfo->wgsize[1] < sgsize) devinfo->wgsize[1] = sgsize; - devinfo->wgsize[2] = sgsize; - } - } - } - else devinfo->wgsize[2] = 0; -# if defined(ACC_OPENCL_XHINTS) && (1 >= ACC_OPENCL_USM) - { /* cl_intel_unified_shared_memory extension */ - cl_platform_id platform = NULL; - cl_bitfield bitfield = 0; - if (0 != (1 & c_dbcsr_acc_opencl_config.xhints) && 2 <= *devinfo->std_level && 0 != devinfo->intel && - /*0 == c_dbcsr_acc_opencl_config.profile &&*/ (0 == devinfo->unified || NULL != (ACC_OPENCL_XHINTS)) && - EXIT_SUCCESS == clGetDeviceInfo(active_id, CL_DEVICE_PLATFORM, sizeof(cl_platform_id), &platform, NULL) && - EXIT_SUCCESS == c_dbcsr_acc_opencl_device_vendor(active_id, "intel", 2 /*platform vendor*/) && - EXIT_SUCCESS == clGetDeviceInfo(active_id, 0x4191 /*CL_DEVICE_DEVICE_MEM_CAPABILITIES_INTEL*/, sizeof(cl_bitfield), - &bitfield, NULL) && - 0 != bitfield) - { - void* ptr[8] = {NULL}; - int i = 0, n = 0; - ptr[0] = clGetExtensionFunctionAddressForPlatform(platform, "clSetKernelArgMemPointerINTEL"); - ptr[1] = clGetExtensionFunctionAddressForPlatform(platform, "clEnqueueMemFillINTEL"); - ptr[2] = clGetExtensionFunctionAddressForPlatform(platform, "clEnqueueMemcpyINTEL"); - ptr[3] = clGetExtensionFunctionAddressForPlatform(platform, "clDeviceMemAllocINTEL"); - ptr[4] = clGetExtensionFunctionAddressForPlatform(platform, "clSharedMemAllocINTEL"); - ptr[5] = clGetExtensionFunctionAddressForPlatform(platform, "clHostMemAllocINTEL"); - ptr[6] = clGetExtensionFunctionAddressForPlatform(platform, "clMemFreeINTEL"); - for (; i < (int)(sizeof(ptr) / sizeof(*ptr)); ++i) { - if (NULL != ptr[i]) ++n; - } - if (7 == n) { - LIBXSMM_ASSIGN127(&devinfo->clSetKernelArgMemPointerINTEL, ptr + 0); - LIBXSMM_ASSIGN127(&devinfo->clEnqueueMemFillINTEL, ptr + 1); - LIBXSMM_ASSIGN127(&devinfo->clEnqueueMemcpyINTEL, ptr + 2); - LIBXSMM_ASSIGN127(&devinfo->clDeviceMemAllocINTEL, ptr + 3); - LIBXSMM_ASSIGN127(&devinfo->clSharedMemAllocINTEL, ptr + 4); - LIBXSMM_ASSIGN127(&devinfo->clHostMemAllocINTEL, ptr + 5); - LIBXSMM_ASSIGN127(&devinfo->clMemFreeINTEL, ptr + 6); - } - else if (0 != n) { - fprintf(stderr, "WARN ACC/OpenCL: inconsistent state discovered!\n"); - } - } - } -# endif -# if (0 != ACC_OPENCL_USM) - { /* OpenCL 2.0 based SVM capabilities */ - const char* const env_usm = getenv("ACC_OPENCL_USM"); - cl_device_svm_capabilities svmcaps = 0; - if (NULL == env_usm) { - if (0 == devinfo->nv) { /* vendor workaround (force with ACC_OPENCL_USM=1) */ - result = clGetDeviceInfo(active_id, CL_DEVICE_SVM_CAPABILITIES, sizeof(cl_device_svm_capabilities), &svmcaps, NULL); - assert(EXIT_SUCCESS == result || 0 == svmcaps); - } - } - else svmcaps = (cl_device_svm_capabilities)atoi(env_usm); - devinfo->usm = (cl_int)svmcaps; - } -# endif -# if defined(ACC_OPENCL_CMDAGR) - if (0 != devinfo->intel) { /* device vendor (above) can now be used */ - int result_cmdagr = EXIT_SUCCESS; - const cl_command_queue q = ACC_OPENCL_CREATE_COMMAND_QUEUE(context, active_id, properties, &result_cmdagr); - if (EXIT_SUCCESS == result_cmdagr) { - assert(NULL != q); - clReleaseCommandQueue(q); - } - } -# endif - properties[1] = 0; - if (EXIT_SUCCESS == result) { - devinfo->stream.queue = ACC_OPENCL_CREATE_COMMAND_QUEUE(context, active_id, properties, &result); - } - } - if (EXIT_SUCCESS == result) { - if (NULL == devinfo->context || device_id != c_dbcsr_acc_opencl_config.device_id) { - c_dbcsr_acc_opencl_config.device_id = device_id; - devinfo->context = context; - } - } - else memset(devinfo, 0, sizeof(*devinfo)); - } - if (NULL != lock) ACC_OPENCL_RELEASE(lock); - } - else result = EXIT_FAILURE; - } - else result = EXIT_FAILURE; - assert(EXIT_SUCCESS == result || NULL == devinfo->context); - return result; -} - - -int c_dbcsr_acc_set_active_device(int device_id) { - /* avoid ACC_OPENCL_PROFILE_DBCSR in this routine */ - int result = EXIT_SUCCESS; - if (0 <= device_id) { -# if defined(__DBCSR_ACC) && defined(__OFFLOAD_OPENCL) - if (0 == c_dbcsr_acc_opencl_config.ndevices) { /* not initialized */ - result = c_dbcsr_acc_init(); - } -# endif - } - else result = EXIT_FAILURE; - if (EXIT_SUCCESS == result) { - if (device_id < c_dbcsr_acc_opencl_config.ndevices) { -# if defined(ACC_OPENCL_CACHE_DID) - if (c_dbcsr_acc_opencl_active_id != (device_id + 1)) -# endif - { - result = c_dbcsr_acc_opencl_set_active_device(c_dbcsr_acc_opencl_config.lock_main, device_id); -# if defined(ACC_OPENCL_CACHE_DID) - if (EXIT_SUCCESS == result) c_dbcsr_acc_opencl_active_id = device_id + 1; -# endif - } - } - else result = EXIT_FAILURE; - } - ACC_OPENCL_RETURN(result); -} - - -int c_dbcsr_acc_opencl_flags_atomics(const c_dbcsr_acc_opencl_device_t* devinfo, c_dbcsr_acc_opencl_atomic_fp_t kind, - const char* exts[], size_t* exts_maxlen, char flags[], size_t flags_maxlen) { - size_t ext1, ext2; - int result = 0; - for (ext1 = 0; ext1 < (NULL != exts_maxlen ? *exts_maxlen : 0); ++ext1) { - if (NULL == exts[ext1] || '\0' == *exts[ext1]) break; - } - for (ext2 = ext1 + 1; ext2 < (NULL != exts_maxlen ? *exts_maxlen : 0); ++ext2) { - if (NULL == exts[ext2] || '\0' == *exts[ext2]) break; - } - if (NULL != devinfo && NULL != exts_maxlen && ext2 < *exts_maxlen) { - const cl_device_id device_id = c_dbcsr_acc_opencl_config.devices[c_dbcsr_acc_opencl_config.device_id]; - const char* atomic_type = ""; - switch (kind) { - case c_dbcsr_acc_opencl_atomic_fp_64: { - exts[ext1] = "cl_khr_fp64 cl_khr_int64_base_atomics cl_khr_int64_extended_atomics"; - if (2 <= *devinfo->std_level && EXIT_SUCCESS == c_dbcsr_acc_opencl_device_ext(device_id, exts, ext2)) { - atomic_type = "-DTA=long -DTA2=atomic_long -DTF=atomic_double"; - } - else { - exts[ext1] = "cl_khr_fp64 cl_khr_int64_base_atomics"; - if (EXIT_SUCCESS == c_dbcsr_acc_opencl_device_ext(device_id, exts, ext2)) { - atomic_type = "-DTA=long"; - } - else { /* fallback */ - exts[ext1] = "cl_khr_fp64 cl_khr_global_int32_base_atomics cl_khr_global_int32_extended_atomics"; - if (2 <= *devinfo->std_level && EXIT_SUCCESS == c_dbcsr_acc_opencl_device_ext(device_id, exts, ext2)) { - atomic_type = "-DATOMIC32_ADD64 -DTA=int -DTA2=atomic_int -DTF=atomic_double"; - } - else { - exts[ext1] = "cl_khr_fp64 cl_khr_global_int32_base_atomics"; - if (EXIT_SUCCESS == c_dbcsr_acc_opencl_device_ext(device_id, exts, ext2)) { - atomic_type = "-DATOMIC32_ADD64 -DTA=int"; - } - else kind = c_dbcsr_acc_opencl_atomic_fp_no; - } - } - } - } break; - case c_dbcsr_acc_opencl_atomic_fp_32: { - exts[ext1] = "cl_khr_global_int32_base_atomics cl_khr_global_int32_extended_atomics"; - if (2 <= *devinfo->std_level && EXIT_SUCCESS == c_dbcsr_acc_opencl_device_ext(device_id, exts, ext2)) { - exts[ext2] = "cl_khr_int64_base_atomics cl_khr_int64_extended_atomics"; - atomic_type = "-DTA=int -DTA2=atomic_int -DTF=atomic_float"; - } - else { - exts[ext1] = "cl_khr_global_int32_base_atomics"; - if (EXIT_SUCCESS == c_dbcsr_acc_opencl_device_ext(device_id, exts, ext2)) { - exts[ext2] = "cl_khr_int64_base_atomics"; - atomic_type = "-DTA=int"; - } - else kind = c_dbcsr_acc_opencl_atomic_fp_no; - } - } break; - default: assert(c_dbcsr_acc_opencl_atomic_fp_no == kind); - } - if (c_dbcsr_acc_opencl_atomic_fp_no != kind) { - const char *barrier_expr = NULL, *atomic_exp = NULL, *atomic_ops = ""; - const char* const env_barrier = getenv("ACC_OPENCL_BARRIER"); - const char* const env_atomics = getenv("ACC_OPENCL_ATOMICS"); - if (NULL == env_barrier || '0' != *env_barrier) { - barrier_expr = ((2 <= *devinfo->std_level && (0 == devinfo->intel || (CL_DEVICE_TYPE_CPU != devinfo->type))) - ? "-D\"BARRIER(A)=work_group_barrier(A,memory_scope_work_group)\"" - : "-D\"BARRIER(A)=barrier(A)\""); - } - else barrier_expr = ""; /* no barrier */ - assert(NULL != barrier_expr); - if (NULL == env_atomics || '0' != *env_atomics) { - /* can signal/force atomics without confirmation */ - const int force_atomics = ((NULL == env_atomics || '\0' == *env_atomics) ? 0 : atoi(env_atomics)); - if (NULL == env_atomics || '\0' == *env_atomics || 0 != force_atomics) { - cl_bitfield fp_atomics = 0; - if (EXIT_SUCCESS == clGetDeviceInfo(device_id, - (cl_device_info)(c_dbcsr_acc_opencl_atomic_fp_64 == kind ? 0x4232 : 0x4231), sizeof(cl_bitfield), - &fp_atomics, NULL) && - 0 != (/*add*/ (1 << 1) & fp_atomics)) - { - exts[ext2] = "cl_ext_float_atomics"; -# if 1 /* enabling this permitted extension in source code causes compiler warning */ - *exts_maxlen = ext2; /* quietly report extension by reducing exts_maxlen */ -# endif - atomic_exp = (c_dbcsr_acc_opencl_atomic_fp_64 == kind - ? "atomic_fetch_add_explicit((GLOBAL_VOLATILE(atomic_double)*)A,B," - "memory_order_relaxed,memory_scope_work_group)" - : "atomic_fetch_add_explicit((GLOBAL_VOLATILE(atomic_float)*)A,B," - "memory_order_relaxed,memory_scope_work_group)"); - } - else if (0 != force_atomics || (0 != devinfo->intel && ((0x4905 != devinfo->uid && 0 == devinfo->unified)))) { - if ((((0 != force_atomics || (0 != devinfo->intel && ((0x0bd0 <= devinfo->uid && 0x0bdb >= devinfo->uid) || - c_dbcsr_acc_opencl_atomic_fp_32 == kind)))))) - { - if (0 == force_atomics && (0 == devinfo->intel || 0x0bd0 > devinfo->uid || 0x0bdb < devinfo->uid)) { - exts[ext2] = "cl_intel_global_float_atomics"; - atomic_ops = "-Dcl_intel_global_float_atomics"; - } - else { - atomic_ops = ((2 > *devinfo->std_level && 2 > force_atomics) - ? "-DATOMIC_PROTOTYPES=1" - : (3 > force_atomics ? "-DATOMIC_PROTOTYPES=2" : "-DATOMIC_PROTOTYPES=3")); - } - atomic_exp = ((2 > *devinfo->std_level && 2 > force_atomics) ? "atomic_add(A,B)" - : "atomic_fetch_add_explicit((GLOBAL_VOLATILE(TF)*)A,B," - "memory_order_relaxed,memory_scope_work_group)"); - } - else { - atomic_exp = "atomic_add_global_cmpxchg(A,B)"; - atomic_ops = "-DCMPXCHG=atom_cmpxchg"; - } - } - else if (0 == devinfo->nv) { - if (1 >= devinfo->amd) { - atomic_ops = (c_dbcsr_acc_opencl_atomic_fp_32 == kind ? "-DCMPXCHG=atomic_cmpxchg" : "-DCMPXCHG=atom_cmpxchg"); - atomic_exp = "atomic_add_global_cmpxchg(A,B)"; - exts[ext2] = NULL; - } - else { /* GCN */ - atomic_exp = (c_dbcsr_acc_opencl_atomic_fp_64 == kind - ? "__builtin_amdgcn_global_atomic_fadd_f64(A,B,__ATOMIC_RELAXED,__OPENCL_MEMORY_SCOPE_WORK_GROUP)" - : "__builtin_amdgcn_global_atomic_fadd_f32(A,B,__ATOMIC_RELAXED,__OPENCL_MEMORY_SCOPE_WORK_GROUP)"); - } - } - else { /* xchg */ - assert(NULL != atomic_ops && '\0' == *atomic_ops); - atomic_exp = "atomic_add_global_xchg(A,B)"; - } - } - else if (NULL != LIBXSMM_STRISTR(env_atomics, "cmpxchg")) { - atomic_ops = (c_dbcsr_acc_opencl_atomic_fp_32 == kind ? "-DCMPXCHG=atomic_cmpxchg" : "-DCMPXCHG=atom_cmpxchg"); - atomic_exp = "atomic_add_global_cmpxchg(A,B)"; - exts[ext2] = NULL; - } - else { /* xchg */ - atomic_exp = "atomic_add_global_xchg(A,B)"; - atomic_ops = (c_dbcsr_acc_opencl_atomic_fp_32 == kind ? "-DXCHG=atomic_xchg" : "-DXCHG=atom_xchg"); - } - } - else { /* unsynchronized */ - atomic_exp = "*(A)+=(B)"; /* non-atomic update */ - } - assert(NULL != atomic_exp); - /* compose build parameters and flags */ - result = LIBXSMM_SNPRINTF(flags, flags_maxlen, " -DTAN=%i %s %s -D\"ATOMIC_ADD_GLOBAL(A,B)=%s\" %s", kind, atomic_type, - atomic_ops, atomic_exp, barrier_expr); - } - } - return result; -} - - -int c_dbcsr_acc_opencl_defines(const char defines[], char buffer[], size_t buffer_size, int cleanup) { - const c_dbcsr_acc_opencl_device_t* const devinfo = &c_dbcsr_acc_opencl_config.device; - int result = 0; - if (NULL != buffer && NULL != devinfo->context) { - const int std_clevel = 100 * devinfo->std_clevel[0] + 10 * devinfo->std_clevel[1]; - const int std_level = 100 * devinfo->std_level[0] + 10 * devinfo->std_level[1]; - result = LIBXSMM_SNPRINTF(buffer, buffer_size, " -DACC_OPENCL_VERSION=%u -DACC_OPENCL_C_VERSION=%u%s", std_level, std_clevel, - 0 == c_dbcsr_acc_opencl_config.debug ? " -DNDEBUG" : ""); - if (0 < result && (int)buffer_size > result) { - const int n = LIBXSMM_SNPRINTF( - buffer + result, buffer_size - result, ' ' != buffer[result - 1] ? " %s" : "%s", NULL != defines ? defines : ""); - if (0 <= n) { - if ((int)buffer_size > (result += n) && 0 != cleanup) { - char* replace = strpbrk(buffer + result - n, "\""); /* more portable (system/cpp needs quotes to protect braces) */ - for (; NULL != replace; replace = strpbrk(replace + 1, "\"")) *replace = ' '; - } - } - else result = -1; - } - } - else result = -1; - return result; -} - - -int c_dbcsr_acc_opencl_kernel_flags(const char build_params[], const char build_options[], const char try_options[], - cl_program program, char buffer[], size_t buffer_size) { - const c_dbcsr_acc_opencl_device_t* const devinfo = &c_dbcsr_acc_opencl_config.device; - int result = EXIT_SUCCESS, nchar = 0; - assert(NULL != program && (NULL != buffer || 0 == buffer_size)); - nchar = c_dbcsr_acc_opencl_defines(build_params, buffer, buffer_size, 1 /*cleanup*/); - if (0 <= nchar && (int)buffer_size > nchar) { - const int debug = (0 != c_dbcsr_acc_opencl_config.debug && 0 != devinfo->intel && CL_DEVICE_TYPE_CPU != devinfo->type); - int n = LIBXSMM_SNPRINTF(buffer + nchar, buffer_size - nchar, " %s%s %s", 0 == debug ? "" : "-gline-tables-only ", - devinfo->std_flag, NULL != build_options ? build_options : ""); - if (0 <= n) { - nchar += n; - if (NULL != try_options && '\0' != *try_options) { /* length is not reported in result */ - n = LIBXSMM_SNPRINTF(buffer + nchar, buffer_size - nchar, " %s", try_options); - if (0 > n || (int)buffer_size <= (nchar + n)) buffer[nchar] = '\0'; - } - } - else nchar = n; - } - if (0 <= nchar && (int)buffer_size > nchar) { /* check if internal flags apply */ - const cl_device_id device_id = c_dbcsr_acc_opencl_config.devices[c_dbcsr_acc_opencl_config.device_id]; - result = clBuildProgram(program, 1 /*num_devices*/, &device_id, buffer, NULL /*callback*/, NULL /*user_data*/); - if (EXIT_SUCCESS != result) { /* failed to apply internal flags */ - ACC_OPENCL_EXPECT(EXIT_SUCCESS == clReleaseProgram(program)); /* avoid unclean state */ - buffer[nchar] = '\0'; /* remove internal flags */ - } - } - else result = EXIT_FAILURE; - return result; -} - - -int c_dbcsr_acc_opencl_kernel(size_t source_kind, const char source[], const char kernel_name[], const char build_params[], - const char build_options[], const char try_options[], int* try_ok, const char* const extnames[], size_t num_exts, - cl_kernel* kernel) { - char buffer[ACC_OPENCL_BUFFERSIZE] = "", buffer_name[ACC_OPENCL_MAXSTRLEN * 2]; - const cl_device_id device_id = c_dbcsr_acc_opencl_config.devices[c_dbcsr_acc_opencl_config.device_id]; - const c_dbcsr_acc_opencl_device_t* const devinfo = &c_dbcsr_acc_opencl_config.device; - int result = ((NULL != source && NULL != kernel_name && '\0' != *kernel_name) ? EXIT_SUCCESS : EXIT_FAILURE); - int ok = EXIT_SUCCESS, source_is_cl = (2 > source_kind), nchar = 0; - size_t size_src = 0, size = 0; - cl_program program = NULL; - FILE* file_src = NULL; - assert(NULL != devinfo->context); - assert(NULL != kernel); - *kernel = NULL; - if (EXIT_SUCCESS == result && (1 == source_kind)) file_src = fopen(source, "rb"); - if (NULL != file_src) { - if (EXIT_SUCCESS == result) { - const char* const file_ext = strrchr(source, '.'); - char* src = NULL; - source_is_cl = ((NULL != file_ext && NULL != LIBXSMM_STRISTR(file_ext + 1, "cl")) ? 1 : 0); - size_src = (EXIT_SUCCESS == fseek(file_src, 0 /*offset*/, SEEK_END) ? ftell(file_src) : 0); - src = (char*)((0 != size_src && EXIT_SUCCESS == fseek(file_src, 0 /*offset*/, SEEK_SET)) - ? libxsmm_aligned_scratch(size_src + source_is_cl /*terminator?*/, 0 /*auto-align*/) - : NULL); - if (NULL != src) { - if (size_src == fread(src, 1 /*sizeof(char)*/, size_src /*count*/, file_src)) { - if (0 != source_is_cl) src[size_src] = '\0'; /* terminator */ - source = src; - } - else { - result = EXIT_FAILURE; - libxsmm_free(src); - } - } - else result = EXIT_FAILURE; - } - fclose(file_src); - } - else size_src = source_kind; - if (EXIT_SUCCESS == result && 0 != source_is_cl) { - const char* ext_source = source; - size_src = strlen(ext_source); - if (NULL != extnames) { - int n = num_exts, nflat = 0; - size_t size_ext = 0; - for (; 0 < n; --n) { - if (NULL != extnames[n - 1]) { - const char* const end = buffer + strlen(extnames[n - 1]); /* before strtok */ - char* ext = strtok(strncpy(buffer, extnames[n - 1], ACC_OPENCL_BUFFERSIZE - 1), ACC_OPENCL_DELIMS " \t"); - for (; NULL != ext; ext = ((ext + 1) < end ? strtok((ext + 1) + strlen(ext), ACC_OPENCL_DELIMS " \t") : NULL), ++nflat) { - size_ext += strlen(ext); - } - } - } - if (0 < size_ext && 0 < nflat) { - const char* const enable_ext = "#pragma OPENCL EXTENSION %s : enable\n"; - const size_t size_src_ext = size_src + size_ext + nflat * (strlen(enable_ext) - 2 /*%s*/); - char* const ext_source_buffer = (char*)libxsmm_aligned_scratch(size_src_ext + 1 /*terminator*/, 0 /*auto-align*/); - if (NULL != ext_source_buffer) { - for (n = 0; 0 < num_exts; --num_exts) { - if (NULL != extnames[num_exts - 1]) { - const char* const end = buffer_name + strlen(extnames[num_exts - 1]); /* before strtok */ - char* ext = strtok( - strncpy(buffer_name, extnames[num_exts - 1], ACC_OPENCL_MAXSTRLEN * 2 - 1), ACC_OPENCL_DELIMS " \t"); - for (; NULL != ext; ext = ((ext + 1) < end ? strtok((ext + 1) + strlen(ext), ACC_OPENCL_DELIMS " \t") : NULL)) { - const char* line = source; - for (;;) { - if (2 != sscanf(line, "#pragma OPENCL EXTENSION %[^: ]%*[: ]%[^\n]", buffer, buffer + ACC_OPENCL_BUFFERSIZE / 2)) - { - line = NULL; - break; - } - else if (0 == strncmp(buffer, ext, ACC_OPENCL_BUFFERSIZE / 2) && - 0 == strncmp(buffer + ACC_OPENCL_BUFFERSIZE / 2, "enable", ACC_OPENCL_BUFFERSIZE / 2)) - { - break; - } - line = strchr(line, '\n'); - if (NULL != line) { - ++line; - } - else break; - } -# if !defined(NDEBUG) - if (EXIT_SUCCESS == c_dbcsr_acc_opencl_device_ext(device_id, (const char* const*)&ext, 1)) -# endif - { /* NDEBUG: assume given extension is supported (confirmed upfront) */ - if (NULL == line) { /* extension is not already part of source */ - n += LIBXSMM_SNPRINTF(ext_source_buffer + n, size_src_ext + 1 /*terminator*/ - n, enable_ext, ext); - } - } -# if !defined(NDEBUG) - else if (0 != strcmp("cl_intel_global_float_atomics", ext)) { - fprintf(stderr, "WARN ACC/OpenCL: extension \"%s\" is not supported.\n", ext); - } -# endif - } - } - } - memcpy(ext_source_buffer + n, source, size_src); - size_src += n; /* according to given/permitted extensions */ - assert(size_src <= size_src_ext); - ext_source_buffer[size_src] = '\0'; - ext_source = ext_source_buffer; - } - } - buffer[0] = '\0'; /* reset to empty */ - } - /* cpp: consider to preprocess kernel (failure does not impact result code) */ - if (0 != c_dbcsr_acc_opencl_config.dump && NULL == file_src) { - char dump_filename[ACC_OPENCL_MAXSTRLEN]; - nchar = LIBXSMM_SNPRINTF(dump_filename, sizeof(dump_filename), "%s.cl", kernel_name); - if (0 < nchar && (int)sizeof(dump_filename) > nchar) { - const int std_flag_len = (int)strlen(devinfo->std_flag); - const char* const env_cpp = getenv("ACC_OPENCL_CPP"); - const int cpp = (NULL == env_cpp ? 1 /*default*/ : atoi(env_cpp)); -# if defined(ACC_OPENCL_CPPBIN) - FILE* const file_cpp = (0 != cpp ? fopen(ACC_OPENCL_CPPBIN, "rb") : NULL); -# else - FILE* const file_cpp = NULL; -# endif - int file_dmp = -1; - if (NULL != file_cpp) { - nchar = LIBXSMM_SNPRINTF(buffer_name, sizeof(buffer_name), ACC_OPENCL_TEMPDIR "/.%s.XXXXXX", kernel_name); - if (0 < nchar && (int)sizeof(buffer_name) > nchar) file_dmp = mkstemp(buffer_name); - fclose(file_cpp); /* existence-check */ - } - else file_dmp = open(dump_filename, O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); - if (0 <= file_dmp) { - if ((0 != std_flag_len && - (3 != write(file_dmp, "/*\n", 3) || std_flag_len != write(file_dmp, devinfo->std_flag, std_flag_len) || - 4 != write(file_dmp, "\n*/\n", 4))) || - size_src != (size_t)write(file_dmp, ext_source, size_src)) - { - file_dmp = -1; - } - ACC_OPENCL_EXPECT(EXIT_SUCCESS == close(file_dmp)); - } -# if defined(ACC_OPENCL_CPPBIN) - if (NULL != file_cpp && 0 <= file_dmp) { /* preprocess source-code */ - const char* sed_pattern = ""; -# if defined(ACC_OPENCL_SEDBIN) - FILE* const file_sed = fopen(ACC_OPENCL_SEDBIN, "rb"); - if (NULL != file_sed) { - sed_pattern = "| " ACC_OPENCL_SEDBIN " '/^[[:space:]]*\\(\\/\\/.*\\)*$/d'"; - fclose(file_sed); /* existence-check */ - } -# endif - nchar = LIBXSMM_SNPRINTF( - buffer, ACC_OPENCL_BUFFERSIZE, ACC_OPENCL_CPPBIN " -P -C -nostdinc %s", 0 == devinfo->nv ? "" : "-D__NV_CL_C_VERSION "); - if (0 < nchar && ACC_OPENCL_BUFFERSIZE > nchar) { - int n = c_dbcsr_acc_opencl_defines(build_params, buffer + nchar, ACC_OPENCL_BUFFERSIZE - nchar, 0 /*cleanup*/); - if (0 <= n && ACC_OPENCL_BUFFERSIZE > (nchar += n)) { - n = LIBXSMM_SNPRINTF(buffer + nchar, ACC_OPENCL_BUFFERSIZE - nchar, - ' ' != buffer[nchar - 1] ? " %s %s >%s" : "%s %s >%s", buffer_name, sed_pattern, dump_filename); - } - nchar = (0 <= n ? nchar : 0) + n; - } - if (0 < nchar && ACC_OPENCL_BUFFERSIZE > nchar && EXIT_SUCCESS == system(buffer)) { - FILE* const file = fopen(dump_filename, "r"); - if (NULL != file) { - const long int size_file = (EXIT_SUCCESS == fseek(file, 0 /*offset*/, SEEK_END) ? ftell(file) : 0); - char* const src = (char*)(EXIT_SUCCESS == fseek(file, 0 /*offset*/, SEEK_SET) - ? libxsmm_aligned_scratch(size_file + 1 /*terminator*/, 0 /*auto-align*/) - : NULL); - if (NULL != src) { - if ((size_t)size_file == fread(src, 1 /*sizeof(char)*/, size_file /*count*/, file)) { - if (source != ext_source) { - void* p = NULL; - LIBXSMM_ASSIGN127(&p, &ext_source); - libxsmm_free(p); - } - src[size_file] = '\0'; - ext_source = src; - } - else libxsmm_free(src); - } - ACC_OPENCL_EXPECT(EXIT_SUCCESS == fclose(file)); - } - } - ACC_OPENCL_EXPECT(EXIT_SUCCESS == unlink(buffer_name)); /* remove temporary file */ - buffer[0] = '\0'; /* reset to empty */ - } -# endif - } - } - program = clCreateProgramWithSource(devinfo->context, 1 /*nlines*/, &ext_source, NULL, &result); - assert(EXIT_SUCCESS != result || NULL != program); - if (EXIT_SUCCESS == result) { - ok = c_dbcsr_acc_opencl_kernel_flags(build_params, build_options, try_options, program, buffer, ACC_OPENCL_BUFFERSIZE); - if (EXIT_SUCCESS == ok) result = ok; - else { - program = clCreateProgramWithSource(devinfo->context, 1 /*nlines*/, &ext_source, NULL, &result); - assert(EXIT_SUCCESS != result || NULL != program); - if (EXIT_SUCCESS == result) { - result = clBuildProgram(program, 1 /*num_devices*/, &device_id, buffer, NULL /*callback*/, NULL /*user_data*/); - ok = EXIT_FAILURE; - } - } - } - if (EXIT_SUCCESS == result) { - if (source != ext_source) { - void* p = NULL; - LIBXSMM_ASSIGN127(&p, &ext_source); - libxsmm_free(p); - } - buffer[0] = '\0'; /* reset to empty */ - if (EXIT_SUCCESS == result) { /* extract kernel */ - *kernel = clCreateKernel(program, kernel_name, &result); - if (EXIT_SUCCESS == result) { - assert(NULL != *kernel); - if (NULL == file_src && (2 <= c_dbcsr_acc_opencl_config.dump || 0 > c_dbcsr_acc_opencl_config.dump)) { - unsigned char* binary = NULL; - binary = (unsigned char*)(EXIT_SUCCESS == - clGetProgramInfo(program, CL_PROGRAM_BINARY_SIZES, sizeof(size_t), &size, NULL) - ? libxsmm_aligned_scratch(size, 0 /*auto-align*/) - : NULL); - if (NULL != binary) { - result = clGetProgramInfo(program, CL_PROGRAM_BINARIES, sizeof(unsigned char*), &binary, NULL); - if (EXIT_SUCCESS == result) { /* successfully queried program binary */ - FILE* file; - nchar = LIBXSMM_SNPRINTF(buffer, ACC_OPENCL_BUFFERSIZE, "%s.dump", kernel_name); - file = ((0 < nchar && ACC_OPENCL_BUFFERSIZE > nchar) ? fopen(buffer, "wb") : NULL); - buffer[0] = '\0'; /* reset to empty */ - if (NULL != file) { - if (size != fwrite(binary, 1, size, file)) result = EXIT_FAILURE; - fclose(file); - } - else result = EXIT_FAILURE; - } - libxsmm_free(binary); - } - else result = EXIT_FAILURE; - } - } - } - } - else if (source != ext_source) { /* error: creating program */ - void* p = NULL; - LIBXSMM_ASSIGN127(&p, &ext_source); - libxsmm_free(p); - } - } - else if (EXIT_SUCCESS == result) { /* binary representation */ - assert(1 < size_src || 0 == size_src); -# if defined(CL_VERSION_2_1) - if (0 != c_dbcsr_acc_opencl_config.dump) program = clCreateProgramWithIL(devinfo->context, source, size_src, &result); - else -# endif - { - program = clCreateProgramWithBinary( - devinfo->context, 1, &device_id, &size_src, (const unsigned char**)&source, NULL /*binary_status*/, &result); - } - assert(EXIT_SUCCESS != result || NULL != program); - if (EXIT_SUCCESS == result) { - ok = c_dbcsr_acc_opencl_kernel_flags(build_params, build_options, try_options, program, buffer, ACC_OPENCL_BUFFERSIZE); - if (EXIT_SUCCESS == ok) result = ok; - else { -# if defined(CL_VERSION_2_1) - if (0 != c_dbcsr_acc_opencl_config.dump) program = clCreateProgramWithIL(devinfo->context, source, size_src, &result); - else -# endif - { - program = clCreateProgramWithBinary( - devinfo->context, 1, &device_id, &size_src, (const unsigned char**)&source, NULL /*binary_status*/, &result); - } - assert(EXIT_SUCCESS != result || NULL != program); - if (EXIT_SUCCESS == result) { - result = clBuildProgram(program, 1 /*num_devices*/, &device_id, buffer, NULL /*callback*/, NULL /*user_data*/); - ok = EXIT_FAILURE; - } - } - } - if (EXIT_SUCCESS == result) { - *kernel = clCreateKernel(program, kernel_name, &result); -# if defined(CL_VERSION_1_2) - /* error creating kernel: discover available kernels in program, and adopt the last kernel listed */ - if (EXIT_SUCCESS != result && - EXIT_SUCCESS == clGetProgramInfo(program, CL_PROGRAM_KERNEL_NAMES, sizeof(char*), buffer, NULL) && '\0' != *buffer) - { - const char *const semicolon = strrchr(buffer, ';'), *const name = (NULL == semicolon ? buffer : (semicolon + 1)); - *kernel = clCreateKernel(program, name, &result); - } -# endif - assert(EXIT_SUCCESS != result || NULL != *kernel); - } - } - if (NULL != file_src) { - void* p = NULL; - LIBXSMM_ASSIGN127(&p, (const void**)&source); - assert(1 == source_kind); - libxsmm_free(p); - } - if (NULL != program) { - if (EXIT_SUCCESS != result && NULL != *kernel) { - ACC_OPENCL_EXPECT(EXIT_SUCCESS == clReleaseKernel(*kernel)); - *kernel = NULL; - } - if (2 <= c_dbcsr_acc_opencl_config.verbosity || 0 > c_dbcsr_acc_opencl_config.verbosity) { - if (EXIT_SUCCESS == clGetProgramBuildInfo(program, device_id, CL_PROGRAM_BUILD_LOG, ACC_OPENCL_BUFFERSIZE, buffer, &size)) { - const char* info = buffer; - while ('\0' != *info && NULL != strchr("\n\r\t ", *info)) ++info; /* remove preceding newline etc. */ - assert(NULL != kernel_name && '\0' != *kernel_name); - if ('\0' != *info) fprintf(stderr, "INFO ACC/OpenCL: %s -> %s\n", kernel_name, info); - } - else buffer[0] = '\0'; /* reset to empty */ - } - ACC_OPENCL_EXPECT(EXIT_SUCCESS == clReleaseProgram(program)); /* release in any case (EXIT_SUCCESS) */ - } - if (NULL != try_ok) *try_ok = result | ok; - ACC_OPENCL_RETURN(result, buffer); -} - - -int c_dbcsr_acc_opencl_set_kernel_ptr(cl_kernel kernel, cl_uint arg_index, const void* arg_value) { - c_dbcsr_acc_opencl_device_t* const devinfo = &c_dbcsr_acc_opencl_config.device; - int result = EXIT_FAILURE; - assert(NULL != devinfo->context); -# if (1 >= ACC_OPENCL_USM) - if (NULL != devinfo->clSetKernelArgMemPointerINTEL) { - result = devinfo->clSetKernelArgMemPointerINTEL(kernel, arg_index, arg_value); - } - else -# endif -# if (0 != ACC_OPENCL_USM) - if (0 != devinfo->usm) - { - result = clSetKernelArgSVMPointer(kernel, arg_index, arg_value); - } - else -# elif defined(NDEBUG) - LIBXSMM_UNUSED(devinfo); -# endif - { - result = clSetKernelArg(kernel, arg_index, sizeof(cl_mem), &arg_value); - } - ACC_OPENCL_RETURN(result); -} - - -double c_dbcsr_acc_opencl_duration(cl_event event, int* result_code) { - cl_ulong begin = 0, end = 0; - int r = EXIT_FAILURE; - double result = 0; - if (NULL != event) { - r = clGetEventProfilingInfo(event, CL_PROFILING_COMMAND_START, sizeof(cl_ulong), &begin, NULL); - if (EXIT_SUCCESS == r) { - r = clGetEventProfilingInfo(event, CL_PROFILING_COMMAND_END, sizeof(cl_ulong), &end, NULL); - if (EXIT_SUCCESS == r) { - result = 1E-9 * LIBXSMM_DELTA(begin, end); /* Nanoseconds->seconds */ - } - } - } - if (NULL != result_code) *result_code = r; - return result; -} - - -typedef struct c_dbcsr_acc_opencl_hist_t { - c_dbcsr_acc_opencl_hist_update_fn* update; - double *vals, min, max; - int *buckets, nbuckets, nqueue, nvals, n; -} c_dbcsr_acc_opencl_hist_t; - - -void c_dbcsr_acc_opencl_hist_create( - void** hist, int nbuckets, int nqueue, int nvals, const c_dbcsr_acc_opencl_hist_update_fn update[]) { - c_dbcsr_acc_opencl_hist_t* h = (c_dbcsr_acc_opencl_hist_t*)malloc(sizeof(c_dbcsr_acc_opencl_hist_t)); - assert(NULL != hist && 0 < nbuckets && 0 < nqueue && 0 < nvals && NULL != update); - if (NULL != h) { - h->vals = (double*)malloc(sizeof(double) * LIBXSMM_MAX(nbuckets, nqueue) * nvals); - h->update = (c_dbcsr_acc_opencl_hist_update_fn*)malloc(sizeof(c_dbcsr_acc_opencl_hist_update_fn) * nvals); - h->buckets = (int*)calloc(nbuckets, sizeof(int)); - if (NULL != h->vals && NULL != h->buckets && NULL != h->update) { - union { - int raw; - float value; - } inf = {0}; -# if defined(INFINITY) && /*overflow warning*/ !defined(_CRAYC) - inf.value = (float)(INFINITY); -# else - inf.raw = 0x7F800000; -# endif - h->min = +inf.value; - h->max = -inf.value; - h->nbuckets = nbuckets; - h->nqueue = nqueue; - h->nvals = nvals; - /* if update[] is NULL, c_dbcsr_acc_opencl_hist_avg is assumed */ - for (h->n = 0; h->n < nvals; ++h->n) h->update[h->n] = update[h->n]; - h->n = 0; - } - else { - free(h->buckets); - free(h->vals); - free(h); - h = NULL; - } - } - *hist = h; -} - - -void c_dbcsr_acc_opencl_hist_avg(double* dst, const double* src) { - assert(NULL != dst && NULL != src); - *dst = 0.5 * (*dst + *src); -} - - -void c_dbcsr_acc_opencl_hist_add(double* dst, const double* src) { - assert(NULL != dst && NULL != src); - *dst += *src; -} - - -void c_dbcsr_acc_opencl_hist_set(ACC_OPENCL_LOCKTYPE* lock, void* hist, const double vals[]) { - if (NULL != hist) { - c_dbcsr_acc_opencl_hist_t* const h = (c_dbcsr_acc_opencl_hist_t*)hist; - int i, j, k; - if (NULL != lock) ACC_OPENCL_ACQUIRE(lock); - if (h->nqueue <= h->n) { - const double *values, w = h->max - h->min; - const int* buckets; - if (h->nqueue == h->n) { - c_dbcsr_acc_opencl_hist_get(NULL /*lock*/, hist, &buckets, NULL /*nbuckets*/, NULL /*range*/, &values, NULL /*nvals*/); - } - for (i = 1; i <= h->nbuckets; ++i) { - const double q = h->min + i * w / h->nbuckets; - if (vals[0] <= q || h->nbuckets == i) { - for (k = 0, j = (i - 1) * h->nvals; k < h->nvals; ++k) { - if (0 != h->buckets[i - 1]) { - (NULL != h->update[k] ? h->update[k] : c_dbcsr_acc_opencl_hist_avg)(h->vals + (j + k), vals + k); - } - else h->vals[j + k] = vals[k]; /* initialize */ - } - ++h->buckets[i - 1]; - break; - } - } - } - else { /* fill-phase */ - if (h->min > vals[0]) h->min = vals[0]; - if (h->max < vals[0]) h->max = vals[0]; - for (k = 0, j = h->nvals * h->n; k < h->nvals; ++k) { - h->vals[j + k] = vals[k]; - } - } - ++h->n; /* count number of accumulated values */ - if (NULL != lock) ACC_OPENCL_RELEASE(lock); - } -} - - -void c_dbcsr_acc_opencl_hist_get( - ACC_OPENCL_LOCKTYPE* lock, void* hist, const int** buckets, int* nbuckets, double range[2], const double** vals, int* nvals) { - int *b = NULL, m = 0, n = 0, i, j, k; - double *v = NULL, r[] = {0, 0}; - assert(NULL != buckets || NULL != range || NULL != vals); - if (NULL != hist) { - c_dbcsr_acc_opencl_hist_t* const h = (c_dbcsr_acc_opencl_hist_t*)hist; - if (NULL != lock) ACC_OPENCL_ACQUIRE(lock); - if (h->n <= h->nqueue) { - const double w = h->max - h->min; - if (h->n < h->nbuckets) h->nbuckets = h->n; - for (i = 1, j = 0; i <= h->nbuckets; j = h->nvals * i++) { - const double p = h->min + (i - 1) * w / h->nbuckets, q = h->min + i * w / h->nbuckets; - for (n = 0, m = 0; n < h->n; m = ++n * h->nvals) { - if (0 == h->buckets[n] && (p < h->vals[m] || 1 == i) && (h->vals[m] <= q || h->nbuckets == i)) { - if (j != m) { - if (0 != h->buckets[i - 1]) { /* accumulate */ - for (k = 0; k < h->nvals; ++k) { - (NULL != h->update[k] ? h->update[k] : c_dbcsr_acc_opencl_hist_avg)(h->vals + (j + k), h->vals + (m + k)); - } - } - else { /* initialize/swap */ - for (k = 0; k < h->nvals; ++k) { - const double value = h->vals[m + k]; - h->vals[m + k] = h->vals[j + k]; - h->vals[j + k] = value; - } - } - } - ++h->buckets[i - 1]; - } - } - } - h->nqueue = 0; - } - if (0 < h->n) { - r[0] = h->min; - r[1] = h->max; - b = h->buckets; - n = h->nbuckets; - v = h->vals; - m = h->nvals; - } - if (NULL != lock) ACC_OPENCL_RELEASE(lock); - } - if (NULL != nbuckets) *nbuckets = n; - if (NULL != buckets) *buckets = b; - if (NULL != nvals) *nvals = m; - if (NULL != vals) *vals = v; - if (NULL != range) { - range[0] = r[0]; - range[1] = r[1]; - } -} - - -void c_dbcsr_acc_opencl_hist_print( - FILE* stream, void* hist, const char title[], const int prec[], const c_dbcsr_acc_opencl_hist_adjust_fn adjust[]) { - int nbuckets = 0, nvals = 0, i = 1, j = 0, k; - const int* buckets = NULL; - const double* vals = NULL; - double range[2]; - c_dbcsr_acc_opencl_hist_get(NULL /*lock*/, hist, &buckets, &nbuckets, range, &vals, &nvals); - if (NULL != stream && NULL != buckets && 0 < nbuckets && NULL != vals && 0 < nvals) { - const double w = range[1] - range[0]; - if (NULL != title) fprintf(stream, "%s pid=%u\n", title, libxsmm_get_pid()); - for (; i <= nbuckets; j = nvals * i++) { - const double q = range[0] + i * w / nbuckets, r = (i != nbuckets ? q : LIBXSMM_MAX(q, vals[j])); - const int c = buckets[i - 1]; - if (NULL != prec) fprintf(stream, "\t#%i <= %.*f: %i", i, prec[0], r, c); - else fprintf(stream, "\t#%i <= %f: %i", i, r, c); - if (0 != c) { - fprintf(stream, " ->"); - for (k = 0; k < nvals; ++k) { - double value; - if (NULL == adjust || NULL == adjust[k]) value = vals[j + k]; - else value = adjust[k](vals[j + k], c); - if (NULL != prec) fprintf(stream, " %.*f", prec[k], value); - else fprintf(stream, " %f", value); - } - } - fprintf(stream, "\n"); - } - } -} - - -void c_dbcsr_acc_opencl_hist_free(void* hist) { - if (NULL != hist) { - c_dbcsr_acc_opencl_hist_t* const h = (c_dbcsr_acc_opencl_hist_t*)hist; - free(h->buckets); - free(h->update); - free(h->vals); - free(h); - } -} - - -const char* c_dbcsr_acc_opencl_stristrn(const char a[], const char b[], size_t maxlen) { - const char* result = NULL; - if (NULL != a && NULL != b && '\0' != *a && '\0' != *b && 0 != maxlen) { - do { - if (tolower(*a) != tolower(*b)) ++a; - else { - const char* c = b; - size_t i = 0; - result = a; - while ('\0' != c[++i] && i != maxlen && '\0' != *++a) { - if (tolower(*a) != tolower(c[i])) { - result = NULL; - break; - } - } - if ('\0' != c[i] && '\0' != c[i + 1] && c[i] != c[i + 1] && i != maxlen) { - result = NULL; - } - else break; - } - } while ('\0' != *a); - } - return result; -} - - -int c_dbcsr_acc_opencl_strimatch(const char a[], const char b[], const char delims[], int* count) { - int result = 0, na = 0, nb = 0; - if (NULL != a && NULL != b && '\0' != *a && '\0' != *b) { - const char* const sep = ((NULL == delims || '\0' == *delims) ? " \t;,:-" : delims); - const char *c, *tmp; - char s[2] = {'\0'}; - size_t m, n; - for (;;) { - while (*s = *b, NULL != strpbrk(s, sep)) ++b; /* left-trim */ - if ('\0' != *b && '[' != *b) ++nb; /* count words */ - else break; - tmp = b; - while ('\0' != *tmp && (*s = *tmp, NULL == strpbrk(s, sep))) ++tmp; - m = tmp - b; - c = c_dbcsr_acc_opencl_stristrn(a, b, LIBXSMM_MIN(1, m)); - if (NULL != c) { - const char* d = c; - while ('\0' != *d && (*s = *d, NULL == strpbrk(s, sep))) ++d; - n = d - c; - if (1 >= n || NULL != c_dbcsr_acc_opencl_stristrn(c, b, LIBXSMM_MIN(m, n))) ++result; - } - b = tmp; - } - for (;;) { /* count number of words */ - while (*s = *a, NULL != strpbrk(s, sep)) ++a; /* left-trim */ - if ('\0' != *a && '[' != *a) ++na; /* count words */ - else break; - while ('\0' != *a && (*s = *a, NULL == strpbrk(s, sep))) ++a; - } - if (na < result) result = na; - } - else result = -1; - if (NULL != count) *count = LIBXSMM_MAX(na, nb); - return result; -} - -# if defined(__cplusplus) -} -# endif - -#endif /*__OPENCL*/ diff --git a/src/acc/opencl/acc_opencl.h b/src/acc/opencl/acc_opencl.h deleted file mode 100644 index 5a30897a443..00000000000 --- a/src/acc/opencl/acc_opencl.h +++ /dev/null @@ -1,481 +0,0 @@ -/*------------------------------------------------------------------------------------------------*/ -/* Copyright (C) by the DBCSR developers group - All rights reserved */ -/* This file is part of the DBCSR library. */ -/* */ -/* For information on the license, see the LICENSE file. */ -/* For further information please visit https://dbcsr.cp2k.org */ -/* SPDX-License-Identifier: BSD-3-Clause */ -/*------------------------------------------------------------------------------------------------*/ -#ifndef ACC_OPENCL_H -#define ACC_OPENCL_H - -/* Support for other libraries, e.g., CP2K's DBM/DBT */ -#if defined(__OFFLOAD_OPENCL) && !defined(__OPENCL) -# define __OPENCL -#endif - -#if defined(__OPENCL) -# if !defined(CL_TARGET_OPENCL_VERSION) -# define CL_TARGET_OPENCL_VERSION 220 -# endif -# if defined(__APPLE__) -# include -# else -# include -# endif -#else -# error Definition of __OPENCL preprocessor symbol is missing! -#endif - -#if !defined(ACC_OPENCL_NOEXT) -# if defined(__APPLE__) -# include -# else -# include -# endif -#endif - -#if !defined(LIBXSMM_SYNC_NPAUSE) -# define LIBXSMM_SYNC_NPAUSE 0 -#endif - -#if defined(__LIBXSMM) && !defined(LIBXSMM_DEFAULT_CONFIG) -# include -# if !defined(LIBXSMM_TIMER_H) -# include -# endif -# if !defined(LIBXSMM_SYNC_H) -# include -# endif -#else -/* OpenCL backend depends on LIBXSMM */ -# include -# if !defined(__LIBXSMM) -# define __LIBXSMM -# endif -#endif - -#if !defined(LIBXSMM_VERSION_NUMBER) -# define LIBXSMM_VERSION_NUMBER \ - LIBXSMM_VERSION4(LIBXSMM_VERSION_MAJOR, LIBXSMM_VERSION_MINOR, LIBXSMM_VERSION_UPDATE, LIBXSMM_VERSION_PATCH) -#endif - -#include "../acc.h" -#if !defined(NDEBUG) -# include -#endif -#include -#include - -#if !defined(ACC_OPENCL_CACHELINE) -# define ACC_OPENCL_CACHELINE LIBXSMM_CACHELINE -#endif -#if !defined(ACC_OPENCL_TLS) -# define ACC_OPENCL_TLS LIBXSMM_TLS -#endif -#if !defined(ACC_OPENCL_MAXALIGN) -# define ACC_OPENCL_MAXALIGN (2 << 20 /*2MB*/) -#endif -#if !defined(ACC_OPENCL_BUFFERSIZE) -# define ACC_OPENCL_BUFFERSIZE (8 << 10 /*8KB*/) -#endif -#if !defined(ACC_OPENCL_MAXSTRLEN) -# define ACC_OPENCL_MAXSTRLEN 48 -#endif -#if !defined(ACC_OPENCL_MAXNDEVS) -# define ACC_OPENCL_MAXNDEVS 64 -#endif -/* Counted on a per-thread basis! */ -#if !defined(ACC_OPENCL_MAXNITEMS) -# define ACC_OPENCL_MAXNITEMS 1024 -#endif -/* First char is CSV-separator by default (w/o spaces) */ -#if !defined(ACC_OPENCL_DELIMS) -# define ACC_OPENCL_DELIMS ",;" -#endif -#if !defined(ACC_OPENCL_CMEM) && 1 -# define ACC_OPENCL_CMEM -#endif -#if !defined(ACC_OPENCL_ASYNC) && 1 -# define ACC_OPENCL_ASYNC getenv("ACC_OPENCL_ASYNC") -#endif -#if !defined(ACC_OPENCL_XHINTS) && 1 -# define ACC_OPENCL_XHINTS getenv("ACC_OPENCL_XHINTS") -#endif -#if !defined(ACC_OPENCL_STREAM_PRIORITIES) && 0 -# if defined(CL_QUEUE_PRIORITY_KHR) -# define ACC_OPENCL_STREAM_PRIORITIES -# endif -#endif -#if !defined(ACC_OPENCL_USM) && defined(CL_VERSION_2_0) && 1 -# if defined(__OFFLOAD_UNIFIED_MEMORY) -/* Do not rely on an Intel extension for pointer arithmetic */ -# define ACC_OPENCL_USM 2 -# else -/* Rely on OpenCL 2.0 (eventually mix-in an Intel ext.) */ -# define ACC_OPENCL_USM 1 -# endif -#else -# define ACC_OPENCL_USM 0 -#endif -/* Activate device by default */ -#if !defined(ACC_OPENCL_ACTIVATE) && 0 -# define ACC_OPENCL_ACTIVATE 0 -#endif -/* Use DBCSR's profile for detailed timings (function name prefix-offset) */ -#if !defined(ACC_OPENCL_PROFILE_DBCSR) && (defined(__OFFLOAD_PROFILING) || 1) -# if defined(__DBCSR_ACC) -# define ACC_OPENCL_PROFILE_DBCSR 8 -# endif -#endif - -/* attaching c_dbcsr_acc_opencl_stream_t is needed */ -#define ACC_OPENCL_STREAM(A) ((const c_dbcsr_acc_opencl_stream_t*)(A)) -/* incompatible with c_dbcsr_acc_event_record */ -#define ACC_OPENCL_EVENT(A) ((const cl_event*)(A)) - -#define ACC_OPENCL_ATOMIC_ACQUIRE(LOCK) \ - do { \ - LIBXSMM_ATOMIC_ACQUIRE(LOCK, LIBXSMM_SYNC_NPAUSE, LIBXSMM_ATOMIC_SEQ_CST); \ - } while (0) -#define ACC_OPENCL_ATOMIC_RELEASE(LOCK) \ - do { \ - LIBXSMM_ATOMIC_RELEASE(LOCK, LIBXSMM_ATOMIC_SEQ_CST); \ - } while (0) - -#if defined(LIBXSMM_ATOMIC_LOCKTYPE) -# define ACC_OPENCL_ATOMIC_LOCKTYPE volatile LIBXSMM_ATOMIC_LOCKTYPE -#else -# define ACC_OPENCL_ATOMIC_LOCKTYPE volatile int -#endif - -#if defined(_OPENMP) -# include -# define ACC_OPENCL_OMP_TID() omp_get_thread_num() -# define ACC_OPENCL_INIT(LOCK) omp_init_lock(LOCK) -# define ACC_OPENCL_DESTROY(LOCK) omp_destroy_lock(LOCK) -# define ACC_OPENCL_ACQUIRE(LOCK) omp_set_lock(LOCK) -# define ACC_OPENCL_RELEASE(LOCK) omp_unset_lock(LOCK) -# define ACC_OPENCL_LOCKTYPE omp_lock_t -#else -# define ACC_OPENCL_OMP_TID() (/*main*/ 0) -# define ACC_OPENCL_INIT(LOCK) (*(LOCK) = 0) -# define ACC_OPENCL_DESTROY(LOCK) -# define ACC_OPENCL_ACQUIRE(LOCK) ACC_OPENCL_ATOMIC_ACQUIRE(LOCK) -# define ACC_OPENCL_RELEASE(LOCK) ACC_OPENCL_ATOMIC_RELEASE(LOCK) -# define ACC_OPENCL_LOCKTYPE ACC_OPENCL_ATOMIC_LOCKTYPE -#endif - -#if defined(CL_VERSION_2_0) -# define ACC_OPENCL_STREAM_PROPERTIES_TYPE cl_queue_properties -# define ACC_OPENCL_CREATE_COMMAND_QUEUE(CTX, DEV, PROPS, RESULT) clCreateCommandQueueWithProperties(CTX, DEV, PROPS, RESULT) -#else -# define ACC_OPENCL_STREAM_PROPERTIES_TYPE cl_int -# define ACC_OPENCL_CREATE_COMMAND_QUEUE(CTX, DEV, PROPS, RESULT) \ - clCreateCommandQueue(CTX, DEV, (cl_command_queue_properties)(NULL != (PROPS) ? ((PROPS)[1]) : 0), RESULT) -#endif - -#if LIBXSMM_VERSION4(1, 17, 0, 0) < LIBXSMM_VERSION_NUMBER -# define ACC_OPENCL_EXPECT(EXPR) LIBXSMM_EXPECT(EXPR) -# define LIBXSMM_STRISTR libxsmm_stristr -#else -# define ACC_OPENCL_EXPECT(EXPR) \ - if (0 == (EXPR)) assert(0) -# define LIBXSMM_STRISTR strstr -#endif - -#define ACC_OPENCL_ERROR() c_dbcsr_acc_opencl_config.device.error.code -#define ACC_OPENCL_ERROR_NAME(CODE) \ - ((EXIT_SUCCESS != c_dbcsr_acc_opencl_config.device.error.code && (CODE) == c_dbcsr_acc_opencl_config.device.error.code) \ - ? c_dbcsr_acc_opencl_config.device.error.name \ - : "") - -#define ACC_OPENCL_ERROR_REPORT(NAME) \ - do { \ - const char* const acc_opencl_error_report_name_ = (const char*)('\0' != *#NAME ? (uintptr_t)(NAME + 0) : 0); \ - if (0 != c_dbcsr_acc_opencl_config.verbosity) { \ - if (NULL != acc_opencl_error_report_name_ && '\0' != *acc_opencl_error_report_name_) { \ - fprintf(stderr, "ERROR ACC/OpenCL: failed for %s!\n", acc_opencl_error_report_name_); \ - } \ - else if (0 != c_dbcsr_acc_opencl_config.device.error.code) { \ - if (NULL != c_dbcsr_acc_opencl_config.device.error.name && '\0' != *c_dbcsr_acc_opencl_config.device.error.name) { \ - fprintf(stderr, "ERROR ACC/OpenCL: %s (code=%i)\n", c_dbcsr_acc_opencl_config.device.error.name, \ - c_dbcsr_acc_opencl_config.device.error.code); \ - } \ - else if (-1001 == c_dbcsr_acc_opencl_config.device.error.code) { \ - fprintf(stderr, "ERROR ACC/OpenCL: incomplete OpenCL installation?\n"); \ - } \ - else { \ - fprintf(stderr, "ERROR ACC/OpenCL: unknown error (code=%i)\n", c_dbcsr_acc_opencl_config.device.error.code); \ - } \ - } \ - memset(&c_dbcsr_acc_opencl_config.device.error, 0, sizeof(c_dbcsr_acc_opencl_config.device.error)); \ - } \ - assert(!"SUCCESS"); \ - } while (0) - -#define ACC_OPENCL_CHECK(RESULT, CMD, MSG) \ - do { \ - if (EXIT_SUCCESS == (RESULT)) { \ - (RESULT) = (CMD); /* update result given code from cmd */ \ - c_dbcsr_acc_opencl_config.device.error.name = (MSG); \ - c_dbcsr_acc_opencl_config.device.error.code = (RESULT); \ - assert(EXIT_SUCCESS == (RESULT)); \ - } \ - else ACC_OPENCL_ERROR_REPORT(); \ - } while (0) - -#define ACC_OPENCL_RETURN(RESULT, ...) \ - do { \ - if (EXIT_SUCCESS == (RESULT)) { \ - assert(EXIT_SUCCESS == c_dbcsr_acc_opencl_config.device.error.code); \ - memset(&c_dbcsr_acc_opencl_config.device.error, 0, sizeof(c_dbcsr_acc_opencl_config.device.error)); \ - } \ - else ACC_OPENCL_ERROR_REPORT(__VA_ARGS__); \ - return (RESULT); \ - } while (0) - - -#if defined(__cplusplus) -extern "C" { -#endif - -/** Rich type denoting an error. */ -typedef struct c_dbcsr_acc_opencl_error_t { - const char* name; - int code; -} c_dbcsr_acc_opencl_error_t; - -/** Information about streams (c_dbcsr_acc_stream_create). */ -typedef struct c_dbcsr_acc_opencl_stream_t { - cl_command_queue queue; - int tid; -#if defined(ACC_OPENCL_STREAM_PRIORITIES) - int priority; -#endif -} c_dbcsr_acc_opencl_stream_t; - -/** Settings updated during c_dbcsr_acc_set_active_device. */ -typedef struct c_dbcsr_acc_opencl_device_t { - /** Activated device context. */ - cl_context context; - /** - * Stream for internal purpose, e.g., stream-argument - * (ACC-interface) can be NULL (synchronous) - */ - c_dbcsr_acc_opencl_stream_t stream; - /** Last error (not necessarily thread-safe/specific). */ - c_dbcsr_acc_opencl_error_t error; - /** OpenCL compiler flag (language standard). */ - char std_flag[16]; - /** OpenCL support-level (major and minor). */ - cl_int std_level[2], std_clevel[2]; - /** - * Maximum size of workgroup (WG), preferred multiple of WG-size (PM), - * and size of subgoup (SG) only if larger-equal than PM. SG is signaled - * smaller if an alternative SG-size exists (SG is zero if no support). - */ - size_t wgsize[3]; - /** Maximum size of memory allocations and constant buffer. */ - cl_ulong size_maxalloc, size_maxcmem; - /** Kind of device (GPU, CPU, or other). */ - cl_device_type type; - /** Whether host memory is unified, and SVM/USM capabilities. */ - cl_int unified, usm; - /** Device-UID. */ - cl_uint uid; - /** Main vendor? */ - cl_int intel, amd, nv; - /* USM support functions */ - cl_int (*clSetKernelArgMemPointerINTEL)(cl_kernel, cl_uint, const void*); - cl_int (*clEnqueueMemFillINTEL)(cl_command_queue, void*, const void*, size_t, size_t, cl_uint, const cl_event*, cl_event*); - cl_int (*clEnqueueMemcpyINTEL)(cl_command_queue, cl_bool, void*, const void*, size_t, cl_uint, const cl_event*, cl_event*); - void* (*clDeviceMemAllocINTEL)(cl_context, cl_device_id, const /*cl_mem_properties_intel*/ void*, size_t, cl_uint, cl_int*); - void* (*clSharedMemAllocINTEL)(cl_context, cl_device_id, const /*cl_mem_properties_intel*/ void*, size_t, cl_uint, cl_int*); - void* (*clHostMemAllocINTEL)(cl_context, const /*cl_mem_properties_intel*/ void*, size_t, cl_uint, cl_int*); - cl_int (*clMemFreeINTEL)(cl_context, void*); -} c_dbcsr_acc_opencl_device_t; - -typedef enum c_dbcsr_acc_event_kind_t { - c_dbcsr_acc_event_kind_none, - c_dbcsr_acc_event_kind_h2d, - c_dbcsr_acc_event_kind_d2h, - c_dbcsr_acc_event_kind_d2d -} c_dbcsr_acc_event_kind_t; - -/** Information about host/device-memory pointer. */ -typedef struct c_dbcsr_acc_opencl_info_memptr_t { - cl_mem memory; /* first item! */ - void* memptr; -} c_dbcsr_acc_opencl_info_memptr_t; - -/** Enumeration of FP-atomic kinds. */ -typedef enum c_dbcsr_acc_opencl_atomic_fp_t { - c_dbcsr_acc_opencl_atomic_fp_no = 0, - c_dbcsr_acc_opencl_atomic_fp_32 = 1, - c_dbcsr_acc_opencl_atomic_fp_64 = 2 -} c_dbcsr_acc_opencl_atomic_fp_t; - -/** - * Settings discovered/setup during c_dbcsr_acc_init (independent of the device) - * and settings updated during c_dbcsr_acc_set_active_device (devinfo). - */ -typedef struct c_dbcsr_acc_opencl_config_t { - /** Table of ordered viable/discovered devices (matching criterion). */ - cl_device_id devices[ACC_OPENCL_MAXNDEVS]; - /** Active device (per process). */ - c_dbcsr_acc_opencl_device_t device; - /** Locks used by domain. */ - ACC_OPENCL_LOCKTYPE *lock_main, *lock_stream, *lock_event, *lock_memory; - /** All memptrs and related storage/counter. */ - c_dbcsr_acc_opencl_info_memptr_t **memptrs, *memptr_data; - size_t nmemptrs; /* counter */ - /** Handle-counter. */ - size_t nstreams, nevents; - /** All streams and related storage. */ - c_dbcsr_acc_opencl_stream_t **streams, *stream_data; - /** All events and related storage. */ - cl_event **events, *event_data; - /** Device-ID to lookup devices-array. */ - cl_int device_id; - /** Kernel-parameters are matched against device's UID */ - cl_uint devmatch; - /** Split devices into sub-devices (if possible) */ - cl_int devsplit; - /** Verbosity level (output on stderr). */ - cl_int verbosity; - /** Guessed number of ranks per node (local), and rank-ID. */ - cl_int nranks, nrank; - /** Non-zero if library is initialized (negative: no device). */ - cl_int ndevices; - /** Maximum number of threads (omp_get_max_threads). */ - cl_int nthreads; -#if defined(ACC_OPENCL_STREAM_PRIORITIES) - /** Runtime-adjust ACC_OPENCL_STREAM_PRIORITIES. */ - cl_int priority; -#endif - /** Runtime-enable ACC_OPENCL_PROFILE_DBCSR. */ - cl_int profile; - /** Detailed/optional insight. */ - void *hist_h2d, *hist_d2h, *hist_d2d; - /** Configuration and execution-hints. */ - cl_int xhints; - /** Asynchronous memory operations. */ - cl_int async; - /** Debug (output/symbols, etc.). */ - cl_int debug; - /** Dump level. */ - cl_int dump; - /** WA level */ - cl_int wa; -} c_dbcsr_acc_opencl_config_t; - -/** Global configuration setup in c_dbcsr_acc_init. */ -extern c_dbcsr_acc_opencl_config_t c_dbcsr_acc_opencl_config; - -/** If buffers are hinted for non-concurrent writes aka "OpenCL constant". */ -int c_dbcsr_acc_opencl_use_cmem(const c_dbcsr_acc_opencl_device_t* devinfo); -/** Determines host-pointer registration (for modification). Returns NULL if memory is SVM/USM. */ -c_dbcsr_acc_opencl_info_memptr_t* c_dbcsr_acc_opencl_info_hostptr(const void* memory); -/** - * Determines device-pointer registration (for modification; internal). The offset is measured in elsize. - * Returns NULL if memory is SVM/USM (offset is zero in this case). - */ -c_dbcsr_acc_opencl_info_memptr_t* c_dbcsr_acc_opencl_info_devptr_modify( - ACC_OPENCL_LOCKTYPE* lock, void* memory, size_t elsize, const size_t* amount, size_t* offset); -/** Determines device-pointer registration for info/ro (lock-control); offset is measured in elsize. */ -int c_dbcsr_acc_opencl_info_devptr_lock(c_dbcsr_acc_opencl_info_memptr_t* info, ACC_OPENCL_LOCKTYPE* lock, const void* memory, - size_t elsize, const size_t* amount, size_t* offset); -/** Determines device-pointer registration for info/ro; offset is measured in elsize. */ -int c_dbcsr_acc_opencl_info_devptr( - c_dbcsr_acc_opencl_info_memptr_t* info, const void* memory, size_t elsize, const size_t* amount, size_t* offset); -/** Finds an existing stream for the given thread-ID (or NULL). */ -const c_dbcsr_acc_opencl_stream_t* c_dbcsr_acc_opencl_stream(ACC_OPENCL_LOCKTYPE* lock, int thread_id); -/** Determines default-stream (see c_dbcsr_acc_opencl_device_t::stream). */ -const c_dbcsr_acc_opencl_stream_t* c_dbcsr_acc_opencl_stream_default(void); -/** Like c_dbcsr_acc_memset_zero, but supporting an arbitrary value used as initialization pattern. */ -int c_dbcsr_acc_opencl_memset(void* dev_mem, int value, size_t offset, size_t nbytes, void* stream); -/** Amount of device memory; local memory is only non-zero if separate from global. */ -int c_dbcsr_acc_opencl_info_devmem(cl_device_id device, size_t* mem_free, size_t* mem_total, size_t* mem_local, int* mem_unified); -/** Get device-ID for given device, and optionally global device-ID. */ -int c_dbcsr_acc_opencl_device_id(cl_device_id device, int* device_id, int* global_id); -/** Confirm the vendor of the given device. */ -int c_dbcsr_acc_opencl_device_vendor(cl_device_id device, const char vendor[], int use_platform_name); -/** Capture or calculate UID based on the device-name. */ -int c_dbcsr_acc_opencl_device_uid(cl_device_id device, const char devname[], unsigned int* uid); -/** Based on the device-ID, return the device's UID (capture or calculate), device name, and platform name. */ -int c_dbcsr_acc_opencl_device_name( - cl_device_id device, char name[], size_t name_maxlen, char platform[], size_t platform_maxlen, int cleanup); -/** Return the OpenCL support-level for the given device. */ -int c_dbcsr_acc_opencl_device_level( - cl_device_id device, int std_clevel[2], int std_level[2], char std_flag[16], cl_device_type* type); -/** Check if given device supports the extensions. */ -int c_dbcsr_acc_opencl_device_ext(cl_device_id device, const char* const extnames[], int num_exts); -/** Create context for given device. */ -int c_dbcsr_acc_opencl_create_context(cl_device_id device_id, cl_context* context); -/** Internal variant of c_dbcsr_acc_set_active_device. */ -int c_dbcsr_acc_opencl_set_active_device(ACC_OPENCL_LOCKTYPE* lock, int device_id); -/** Assemble flags to support atomic operations. */ -int c_dbcsr_acc_opencl_flags_atomics(const c_dbcsr_acc_opencl_device_t* devinfo, c_dbcsr_acc_opencl_atomic_fp_t kind, - const char* exts[], size_t* exts_maxlen, char flags[], size_t flags_maxlen); -/** Assemble given defines and internal definitions. */ -int c_dbcsr_acc_opencl_defines(const char defines[], char buffer[], size_t buffer_size, int cleanup); -/** Combines build-params, build-options, and extra flags. */ -int c_dbcsr_acc_opencl_kernel_flags(const char build_params[], const char build_options[], const char try_options[], - cl_program program, char buffer[], size_t buffer_size); -/** - * Build kernel from source with given kernel_name, build_params and build_options. - * The build_params are meant to instantiate the kernel (-D) whereas build_options - * are are meant to be compiler-flags. The source_kind denotes source's content: - * 0: OpenCL source code - * 1: Filename (OpenCL or binary) - * >1: Binary code (source_kind denotes size) - */ -int c_dbcsr_acc_opencl_kernel(size_t source_kind, const char source[], const char kernel_name[], const char build_params[], - const char build_options[], const char try_build_options[], int* try_ok, const char* const extnames[], size_t num_exts, - cl_kernel* kernel); -/** Per-thread variant of c_dbcsr_acc_device_synchronize. */ -int c_dbcsr_acc_opencl_device_synchronize(ACC_OPENCL_LOCKTYPE* lock, int thread_id); -/** To support USM, call this function for pointer arguments instead of clSetKernelArg. */ -int c_dbcsr_acc_opencl_set_kernel_ptr(cl_kernel kernel, cl_uint arg_index, const void* arg_value); - -/** Support older LIBXSMM (libxsmm_pmalloc_init). */ -void c_dbcsr_acc_opencl_pmalloc_init(size_t size, size_t* num, void* pool[], void* storage); -/** Support older LIBXSMM (libxsmm_pmalloc). */ -void* c_dbcsr_acc_opencl_pmalloc(ACC_OPENCL_LOCKTYPE* lock, void* pool[], size_t* i); -/** Support older LIBXSMM (libxsmm_pfree). */ -void c_dbcsr_acc_opencl_pfree(const void* pointer, void* pool[], size_t* i); - -/** Measure time in seconds for the given event. */ -double c_dbcsr_acc_opencl_duration(cl_event event, int* result_code); - -typedef void (*c_dbcsr_acc_opencl_hist_update_fn)(double* /*dst*/, const double* /*src*/); -typedef double (*c_dbcsr_acc_opencl_hist_adjust_fn)(double /*value*/, int count); -void c_dbcsr_acc_opencl_hist_create( - void** hist, int nbuckets, int nqueue, int nvals, const c_dbcsr_acc_opencl_hist_update_fn update[]); -void c_dbcsr_acc_opencl_hist_avg(double* dst, const double* src); -void c_dbcsr_acc_opencl_hist_add(double* dst, const double* src); -void c_dbcsr_acc_opencl_hist_set(ACC_OPENCL_LOCKTYPE* lock, void* hist, const double vals[]); -void c_dbcsr_acc_opencl_hist_get( - ACC_OPENCL_LOCKTYPE* lock, void* hist, const int** buckets, int* nbuckets, double range[2], const double** vals, int* nvals); -void c_dbcsr_acc_opencl_hist_print( - FILE* stream, void* hist, const char title[], const int prec[], const c_dbcsr_acc_opencl_hist_adjust_fn adjust[]); -void c_dbcsr_acc_opencl_hist_free(void* hist); - -/** Return the pointer to the 1st match of "b" in "a", or NULL (no match). */ -const char* c_dbcsr_acc_opencl_stristrn(const char a[], const char b[], size_t maxlen); - -/** - * Count the number of words in A (or B) with match in B (or A) respectively (case-insensitive). - * Can be used to score the equality of A and B on a word-basis. The result is independent of - * A-B or B-A order (symmetry). The score cannot exceed the number of words in A or B. - * Optional delimiters determine characters splitting words (can be NULL). - * Optional count yields total number of words. - */ -int c_dbcsr_acc_opencl_strimatch(const char a[], const char b[], const char delims[], int* count); - -#if defined(__cplusplus) -} -#endif - -#endif /*ACC_OPENCL_H*/ diff --git a/src/acc/opencl/acc_opencl.sh b/src/acc/opencl/acc_opencl.sh deleted file mode 100755 index 90d7cfd4b67..00000000000 --- a/src/acc/opencl/acc_opencl.sh +++ /dev/null @@ -1,263 +0,0 @@ -#!/usr/bin/env bash -#################################################################################################### -# Copyright (C) by the DBCSR developers group - All rights reserved # -# This file is part of the DBCSR library. # -# # -# For information on the license, see the LICENSE file. # -# For further information please visit https://dbcsr.cp2k.org # -# SPDX-License-Identifier: BSD-3-Clause # -#################################################################################################### -# shellcheck disable=SC2048,SC2129 - -BASENAME=$(command -v basename) -DIRNAME=$(command -v dirname) -HEAD=$(command -v head) -SORT=$(command -v sort) -SED=$(command -v gsed) -CAT=$(command -v cat) -CPP=$(command -v cpp) -TR=$(command -v tr) -RM=$(command -v rm) -WC=$(command -v wc) - -# flags used to control preprocessor -CPPBASEFLAGS="-dD -P -fpreprocessed" - -# delimiters allowed in CSV-file -DELIMS=";,\t|/" - -# GNU sed is desired (macOS) -if [ ! "${SED}" ]; then - SED=$(command -v sed) -fi - -trap_exit() { - if [ "0" != "$?" ] && [ "${HFILE}" ]; then ${RM} -f "${OFILE}"; fi -} - -process_pre() { - if [ "$1" ]; then - if [ "${CPP}" ] && \ - [ "$(eval "${CPP} ${CPPBASEFLAGS} $1" 2>/dev/null >/dev/null && echo "YES")" ]; - then - if [ "${CPPFLAGS}" ] && \ - [ "$(eval "${CPP} ${CPPFLAGS} ${CPPBASEFLAGS} $1" 2>/dev/null >/dev/null && echo "YES")" ]; - then - eval "${CPP} ${CPPFLAGS} ${CPPBASEFLAGS} $1" 2>/dev/null - else - eval "${CPP} ${CPPBASEFLAGS} $1" 2>/dev/null - fi - else # fallback to sed - ${SED} -r ':a;s%(.*)/\*.*\*/%\1%;ta;/\/\*/!b;N;ba' "$1" - fi | \ - if [ ! "$2" ] || [ "0" = "$2" ]; then # strip include guards - GUARD=$(${BASENAME} "$1" | ${TR} '[:lower:]' '[:upper:]' | ${TR} '.' '_') - if [ "${GUARD}" ] && [ "$(${SED} -n "/${GUARD}/p" "$1")" ]; then - ${SED} "/${GUARD}/d;\${/\s*\#\s*endif/d}" - else - ${CAT} - fi - else - ${CAT} - fi - fi -} - -process() { - IFS=$'\n' - while read -r LINE; do - INCLUDE=$(${SED} -n "s/#[[:space:]]*include[[:space:]][[:space:]]*\"/\"/p" <<<"${LINE}") - if [ "${INCLUDE}" ] && [ "$1" ] && [ -e "$1" ]; then - CLINC=$(${SED} "s/\"//g" <<<"${INCLUDE}") - CLPATH=$(${DIRNAME} "$1") - FILE=${CLPATH}/${CLINC} - if [ "${FILE}" ] && [ -e "${FILE}" ]; then - process_pre "${FILE}" "$2" | process "${FILE}" "$2" - else - >&2 echo "WARNING: header file ${FILE} not found!" - #exit 1 - fi - else - ${SED} <<<"${LINE}" \ - -e '/^[[:space:]]*$/d' -e 's/[[:space:]]*$//' \ - -e 's/[[:space:]]*\\/ \\\\/g' -e 's/"/\\"/g' \ - -e 's/^/ "/' -e 's/$/\\n" \\/' - fi - done - unset IFS -} - -if [ "${BASENAME}" ] && [ "${DIRNAME}" ] && [ "${HEAD}" ] && [ "${SORT}" ] && \ - [ "${SED}" ] && [ "${CAT}" ] && [ "${TR}" ] && [ "${RM}" ] && [ "${WC}" ]; -then - for OFILE in "$@"; do :; done - while test $# -gt 0; do - case "$1" in - -h|--help) - shift $#;; - -k|--keep) - KEEP=1 - shift;; - -b|--banner) - BANNER=$2 - shift 2;; - -p|--params) - PARAMS="$2\t" - shift 2;; - -c|-d|--debug|--comments) - CPPFLAGS+=" -C" - shift;; - -v|--verbose) - VERBOSE=1 - shift;; - *) break;; - esac - done - HERE="$(cd "$(${DIRNAME} "$0")" && pwd -P)" - PARAMDIR=${PARAMDIR:-${PARAMS}} - PARAMDIR=${PARAMDIR:-${HERE}/smm/params} - PARAMDIR=$(echo -e "${PARAMDIR}" | ${TR} -d '\t') - if [ "$#" -gt 1 ]; then - # allow for instance /dev/stdout - if [ "${OFILE##*.}" = "h" ]; then - if [ "${VERBOSE}" ] && [ "0" != "${VERBOSE}" ]; then - echo "$0 $*" # stdout - fi - truncate -s0 "${OFILE}" - HFILE=${OFILE} - elif [ "${OFILE##*.}" = "cl" ] || [ "${OFILE##*.}" = "csv" ]; then - >&2 echo "ERROR: no output/header file given!" - exit 1 - elif [ "${VERBOSE}" ] && [ "0" != "${VERBOSE}" ]; then - if [[ ${OFILE} != /dev/stderr ]]; then - >&2 echo "$0 $*" - else # stdout - echo "$0 $*" - fi - fi - trap 'trap_exit' EXIT - RNAME=$(${BASENAME} "$(cd "$(${DIRNAME} "$1")" && pwd -P)") - ANAME=$(${TR} '[:lower:]' '[:upper:]' <<<"${RNAME}") - NFILES_OCL=0 - for CLFILE in ${*:1:${#@}-1}; do - if [ "${CLFILE##*.}" = "cl" ]; then - CLEXT=".cl" - elif [ "${CLFILE##*.}" = "h" ]; then - CLEXT=".h" - else - CLEXT="" - fi - if [ "${CLEXT}" ]; then - if [ -e "${CLFILE}" ]; then - CNAME=$(${BASENAME} "${CLFILE}" "${CLEXT}" | ${SED} "s/${RNAME}_//;s/_opencl//") - BNAME=$(${TR} '[:lower:]' '[:upper:]' <<<"${CNAME}") - SNAME=OPENCL_${ANAME}_STRING_${BNAME} - VNAME=opencl_${RNAME}_source_${CNAME} - MNAME=OPENCL_${ANAME}_SOURCE_${BNAME} - if [ "0" != "$((0<(NFILES_OCL)))" ]; then - echo - elif [ "${BANNER}" ] && [ "0" != "${BANNER}" ]; then - ${HEAD} -n"${BANNER}" "${CLFILE}" - fi - echo "#define ${MNAME} ${VNAME}" - echo "#define ${SNAME} \\" - process_pre "${CLFILE}" "${KEEP}" | process "${CLFILE}" "${KEEP}" - echo " \"\"" - echo "static const char ${VNAME}[] = ${SNAME};" - NFILES_OCL=$((NFILES_OCL+1)) - else - >&2 echo "ERROR: ${CLFILE} does not exist!" - exit 1 - fi >>"${OFILE}" - else - CSVFILES=("${*:NFILES_OCL+1:${#@}-NFILES_OCL-1}") - break - fi - done - if [ "0" = "${NFILES_OCL}" ]; then - >&2 echo "ERROR: no OpenCL file was given!" - exit 1 - fi - NFILES_CSV=0 - for CSVFILE in "${CSVFILES[@]}"; do - if [ "${CSVFILE##*.}" = "csv" ]; then - if [ -f "${CSVFILE}" ]; then - NFILES_CSV=$((NFILES_CSV+1)) - fi - else - >&2 echo "ERROR: ${CSVFILE} is not a CSV file!" - exit 1 - fi - done - if [ "0" = "${NFILES_CSV}" ] && [ "${PARAMDIR}" ] && [ -d "${PARAMDIR}" ]; then - CSVFILES=("${PARAMDIR}"/*.csv) - NFILES_CSV=${#CSVFILES[@]} - fi - for CSVFILE in "${CSVFILES[@]}"; do - if [ ! "${DELIM}" ]; then - SEPAR=$(${SED} -n "1s/[^${DELIMS}]//gp" "${CSVFILE}" 2>/dev/null) - DELIM=${SEPAR:0:1} - MATCH=$(${SED} -n "1s/[^${DELIM}]//gp" "${CSVFILE}" 2>/dev/null) - fi - if [ "${DELIM}" ]; then - CHECK=$(${SED} "/^[[:space:]]*$/d;s/[^${DELIM}]//g" "${CSVFILE}" | ${SORT} -u | ${SED} -n "0,/./p") - if [ "0" != "$((${#MATCH}<${#CHECK}))" ]; then - ERRFILE=${CSVFILES[0]} - elif [ "${MATCH}" != "${CHECK}" ]; then - ERRFILE=${CSVFILE} - fi - else - ERRFILE=${CSVFILE} - fi - if [ "${ERRFILE}" ] && [ -f "${ERRFILE}" ]; then - >&2 echo "WARNING: ${ERRFILE} is malformed and ignored!" - fi - done - DEVPAT="s/${DELIM}..*//" - DEVICES=$(for CSVFILE in "${CSVFILES[@]}"; do ${SED} "1d;/^[[:space:]]*$/d;${DEVPAT}" "${CSVFILE}"; done | ${SORT} -u) - SNAME=OPENCL_${ANAME}_STRING_PARAMS_SMM - VNAME=opencl_${RNAME}_params_smm - DNAME=opencl_${RNAME}_devices - MNAME=$(${TR} '[:lower:]' '[:upper:]' <<<"${VNAME}") - NNAME=$(${TR} '[:lower:]' '[:upper:]' <<<"${DNAME}") - if [ "${DEVICES}" ]; then - echo - echo "#define ${MNAME} ${VNAME}" - echo "#define ${SNAME} \\" - CSVLINES=$(for CSVFILE in "${CSVFILES[@]}"; do ${SED} "1d;/^[[:space:]]*$/d;s/[\r]*$/\\\n\" \\\/" "${CSVFILE}"; done) - IFS=$'\n' - for LINE in ${CSVLINES}; do - I=0; IDEVICE=$(${SED} "${DEVPAT}" <<<"${LINE}") - for DEVICE in ${DEVICES}; do - if [ "${DEVICE}" = "${IDEVICE}" ]; then break; fi - I=$((I+1)); - done - ${SED} "s/[^${DELIM}]*/ \"${I}/" <<<"${LINE}" - done - echo " \"\"" - echo "static const char ${VNAME}[] = ${SNAME};" - echo - echo "#define ${NNAME} ${DNAME}" - echo "static const char *const ${DNAME}[] = {" - I=0; S=","; NDEVICES=$(${WC} -l <<<"${DEVICES}") - for DEVICE in ${DEVICES}; do - I=$((I+1)); if [ "0" != "$((NDEVICES==I))" ]; then S=""; fi - echo " \"${DEVICE}\"${S}" - done - unset IFS - echo "};" - fi >>"${OFILE}" - else - echo "Usage: $0 infile.cl [infile2.cl .. infileN.cl] [infile.csv [.. infileN.csv]] outfile.h" - echo " At least one OpenCL file and one header file must be supplied." - echo " -k|--keep: do not strip include guards (stripped even if necessary)" - echo " -b|--banner N: number of lines used as banner (default: 0)" - echo " -p|--params P: directory-path to CSV-files (can be \"\")" - echo " default: ${PARAMDIR}" - echo " -c|-d|--debug|--comments: keep comments in source-code" - echo " -v|--verbose: repeat command-line arguments" - fi -else - >&2 echo "ERROR: missing prerequisites!" - exit 1 -fi diff --git a/src/acc/opencl/acc_opencl_event.c b/src/acc/opencl/acc_opencl_event.c deleted file mode 100644 index 4ebee696d0f..00000000000 --- a/src/acc/opencl/acc_opencl_event.c +++ /dev/null @@ -1,210 +0,0 @@ -/*------------------------------------------------------------------------------------------------*/ -/* Copyright (C) by the DBCSR developers group - All rights reserved */ -/* This file is part of the DBCSR library. */ -/* */ -/* For information on the license, see the LICENSE file. */ -/* For further information please visit https://dbcsr.cp2k.org */ -/* SPDX-License-Identifier: BSD-3-Clause */ -/*------------------------------------------------------------------------------------------------*/ -#if defined(__OPENCL) -# include "acc_opencl.h" - - -# if defined(__cplusplus) -extern "C" { -# endif - -int c_dbcsr_acc_event_create(void** event_p) { - int result = EXIT_SUCCESS; -# if defined(ACC_OPENCL_PROFILE_DBCSR) - int routine_handle; - if (0 != c_dbcsr_acc_opencl_config.profile) { - static const char* routine_name_ptr = LIBXSMM_FUNCNAME + ACC_OPENCL_PROFILE_DBCSR; - static const int routine_name_len = (int)sizeof(LIBXSMM_FUNCNAME) - (ACC_OPENCL_PROFILE_DBCSR + 1); - c_dbcsr_timeset((const char**)&routine_name_ptr, &routine_name_len, &routine_handle); - } -# endif - assert(NULL != c_dbcsr_acc_opencl_config.events && NULL != event_p); - *event_p = c_dbcsr_acc_opencl_pmalloc( - c_dbcsr_acc_opencl_config.lock_event, (void**)c_dbcsr_acc_opencl_config.events, &c_dbcsr_acc_opencl_config.nevents); - if (NULL != *event_p) *(cl_event*)*event_p = NULL; - else result = EXIT_FAILURE; -# if defined(ACC_OPENCL_PROFILE_DBCSR) - if (0 != c_dbcsr_acc_opencl_config.profile) c_dbcsr_timestop(&routine_handle); -# endif - ACC_OPENCL_RETURN(result); -} - - -int c_dbcsr_acc_event_destroy(void* event) { - int result = EXIT_SUCCESS; -# if defined(ACC_OPENCL_PROFILE_DBCSR) - int routine_handle; - if (0 != c_dbcsr_acc_opencl_config.profile) { - static const char* routine_name_ptr = LIBXSMM_FUNCNAME + ACC_OPENCL_PROFILE_DBCSR; - static const int routine_name_len = (int)sizeof(LIBXSMM_FUNCNAME) - (ACC_OPENCL_PROFILE_DBCSR + 1); - c_dbcsr_timeset((const char**)&routine_name_ptr, &routine_name_len, &routine_handle); - } -# endif - if (NULL != event) { - const cl_event clevent = *ACC_OPENCL_EVENT(event); - assert(NULL != c_dbcsr_acc_opencl_config.events); - ACC_OPENCL_ACQUIRE(c_dbcsr_acc_opencl_config.lock_event); - c_dbcsr_acc_opencl_pfree(event, (void**)c_dbcsr_acc_opencl_config.events, &c_dbcsr_acc_opencl_config.nevents); - if (NULL != clevent) { - result = clReleaseEvent(clevent); -# if !defined(NDEBUG) - *(cl_event*)event = NULL; -# endif - } - ACC_OPENCL_RELEASE(c_dbcsr_acc_opencl_config.lock_event); - } -# if defined(ACC_OPENCL_PROFILE_DBCSR) - if (0 != c_dbcsr_acc_opencl_config.profile) c_dbcsr_timestop(&routine_handle); -# endif - ACC_OPENCL_RETURN(result); -} - - -int c_dbcsr_acc_stream_wait_event(void* stream, void* event) { /* wait for an event (device-side) */ - int result = EXIT_SUCCESS; - const c_dbcsr_acc_opencl_stream_t* str = NULL; - cl_event clevent = NULL; -# if defined(ACC_OPENCL_PROFILE_DBCSR) - int routine_handle; - if (0 != c_dbcsr_acc_opencl_config.profile) { - static const char* routine_name_ptr = LIBXSMM_FUNCNAME + ACC_OPENCL_PROFILE_DBCSR; - static const int routine_name_len = (int)sizeof(LIBXSMM_FUNCNAME) - (ACC_OPENCL_PROFILE_DBCSR + 1); - c_dbcsr_timeset((const char**)&routine_name_ptr, &routine_name_len, &routine_handle); - } -# endif - str = (NULL != stream ? ACC_OPENCL_STREAM(stream) : c_dbcsr_acc_opencl_stream_default()); - assert(NULL != str && NULL != str->queue && NULL != event); - clevent = *ACC_OPENCL_EVENT(event); - if (NULL != clevent) { -# if defined(CL_VERSION_1_2) - result = clEnqueueBarrierWithWaitList(str->queue, 1, &clevent, NULL); -# else - result = clEnqueueWaitForEvents(str->queue, 1, &clevent); -# endif - if (EXIT_SUCCESS != result) { - ACC_OPENCL_EXPECT(EXIT_SUCCESS == clReleaseEvent(clevent)); - *(cl_event*)event = NULL; - } - } - else if (3 <= c_dbcsr_acc_opencl_config.verbosity || 0 > c_dbcsr_acc_opencl_config.verbosity) { - fprintf(stderr, "WARN ACC/OpenCL: c_dbcsr_acc_stream_wait_event discovered an empty event.\n"); - } -# if defined(ACC_OPENCL_PROFILE_DBCSR) - if (0 != c_dbcsr_acc_opencl_config.profile) c_dbcsr_timestop(&routine_handle); -# endif - ACC_OPENCL_RETURN(result); -} - - -int c_dbcsr_acc_event_record(void* event, void* stream) { - int result = EXIT_SUCCESS; - const c_dbcsr_acc_opencl_stream_t* str = NULL; - cl_event clevent = NULL, clevent_result = NULL; -# if defined(ACC_OPENCL_PROFILE_DBCSR) - int routine_handle; - if (0 != c_dbcsr_acc_opencl_config.profile) { - static const char* routine_name_ptr = LIBXSMM_FUNCNAME + ACC_OPENCL_PROFILE_DBCSR; - static const int routine_name_len = (int)sizeof(LIBXSMM_FUNCNAME) - (ACC_OPENCL_PROFILE_DBCSR + 1); - c_dbcsr_timeset((const char**)&routine_name_ptr, &routine_name_len, &routine_handle); - } -# endif - str = (NULL != stream ? ACC_OPENCL_STREAM(stream) : c_dbcsr_acc_opencl_stream_default()); - assert(NULL != str && NULL != str->queue && NULL != event); - clevent = *ACC_OPENCL_EVENT(event); -# if defined(CL_VERSION_1_2) - result = clEnqueueMarkerWithWaitList(str->queue, 0, NULL, &clevent_result); -# else - result = clEnqueueMarker(str->queue, &clevent_result); -# endif - if (NULL != clevent) { - const int result_release = clReleaseEvent(clevent); - if (EXIT_SUCCESS == result) result = result_release; - } - if (EXIT_SUCCESS == result) { - assert(NULL != clevent_result); - *(cl_event*)event = clevent_result; - } - else { - if (NULL != clevent_result) ACC_OPENCL_EXPECT(EXIT_SUCCESS == clReleaseEvent(clevent_result)); - *(cl_event*)event = NULL; - } -# if defined(ACC_OPENCL_PROFILE_DBCSR) - if (0 != c_dbcsr_acc_opencl_config.profile) c_dbcsr_timestop(&routine_handle); -# endif - ACC_OPENCL_RETURN(result); -} - - -int c_dbcsr_acc_event_query(void* event, c_dbcsr_acc_bool_t* has_occurred) { - cl_int status = CL_COMPLETE; - int result; -# if defined(ACC_OPENCL_PROFILE_DBCSR) - int routine_handle; - if (0 != c_dbcsr_acc_opencl_config.profile) { - static const char* routine_name_ptr = LIBXSMM_FUNCNAME + ACC_OPENCL_PROFILE_DBCSR; - static const int routine_name_len = (int)sizeof(LIBXSMM_FUNCNAME) - (ACC_OPENCL_PROFILE_DBCSR + 1); - c_dbcsr_timeset((const char**)&routine_name_ptr, &routine_name_len, &routine_handle); - } -# endif - assert(NULL != event && NULL != has_occurred); - result = clGetEventInfo(*ACC_OPENCL_EVENT(event), CL_EVENT_COMMAND_EXECUTION_STATUS, sizeof(cl_int), &status, NULL); - if (EXIT_SUCCESS == result && 0 <= status) *has_occurred = (CL_COMPLETE == status ? 1 : 0); - else { /* error state */ - result = EXIT_SUCCESS; /* soft-error */ - *has_occurred = 1; - } -# if defined(ACC_OPENCL_PROFILE_DBCSR) - if (0 != c_dbcsr_acc_opencl_config.profile) c_dbcsr_timestop(&routine_handle); -# endif - ACC_OPENCL_RETURN(result); -} - - -int c_dbcsr_acc_event_synchronize(void* event) { /* waits on the host-side */ - int result = EXIT_SUCCESS; - cl_event clevent; -# if defined(ACC_OPENCL_PROFILE_DBCSR) - int routine_handle; - if (0 != c_dbcsr_acc_opencl_config.profile) { - static const char* routine_name_ptr = LIBXSMM_FUNCNAME + ACC_OPENCL_PROFILE_DBCSR; - static const int routine_name_len = (int)sizeof(LIBXSMM_FUNCNAME) - (ACC_OPENCL_PROFILE_DBCSR + 1); - c_dbcsr_timeset((const char**)&routine_name_ptr, &routine_name_len, &routine_handle); - } -# endif - assert(NULL != event); - clevent = *ACC_OPENCL_EVENT(event); - if (NULL != clevent) { - if (0 == (32 & c_dbcsr_acc_opencl_config.wa)) { - cl_int status = CL_COMPLETE + 1; - if (64 & c_dbcsr_acc_opencl_config.xhints) { - result = clGetEventInfo(clevent, CL_EVENT_COMMAND_EXECUTION_STATUS, sizeof(cl_int), &status, NULL); - assert(EXIT_SUCCESS == result || CL_COMPLETE != status); - } - if (CL_COMPLETE != status) result = clWaitForEvents(1, &clevent); - } - else { - cl_command_queue queue = NULL; - result = clGetEventInfo(clevent, CL_EVENT_COMMAND_QUEUE, sizeof(cl_command_queue), &queue, NULL); - if (EXIT_SUCCESS == result) result = clFinish(queue); - } - } - else if (3 <= c_dbcsr_acc_opencl_config.verbosity || 0 > c_dbcsr_acc_opencl_config.verbosity) { - fprintf(stderr, "WARN ACC/OpenCL: c_dbcsr_acc_event_synchronize discovered an empty event.\n"); - } -# if defined(ACC_OPENCL_PROFILE_DBCSR) - if (0 != c_dbcsr_acc_opencl_config.profile) c_dbcsr_timestop(&routine_handle); -# endif - ACC_OPENCL_RETURN(result); -} - -# if defined(__cplusplus) -} -# endif - -#endif /*__OPENCL*/ diff --git a/src/acc/opencl/acc_opencl_mem.c b/src/acc/opencl/acc_opencl_mem.c deleted file mode 100644 index d1c7fd126e6..00000000000 --- a/src/acc/opencl/acc_opencl_mem.c +++ /dev/null @@ -1,1096 +0,0 @@ -/*------------------------------------------------------------------------------------------------*/ -/* Copyright (C) by the DBCSR developers group - All rights reserved */ -/* This file is part of the DBCSR library. */ -/* */ -/* For information on the license, see the LICENSE file. */ -/* For further information please visit https://dbcsr.cp2k.org */ -/* SPDX-License-Identifier: BSD-3-Clause */ -/*------------------------------------------------------------------------------------------------*/ -#if defined(__OPENCL) -# include "acc_opencl.h" -# include -# if defined(_WIN32) -# include -# else -# if !defined(__linux__) && defined(__APPLE__) && defined(__MACH__) -# include -# include -# endif -# include -# endif - -# if !defined(ACC_OPENCL_MEM_ALLOC) -# if 1 -# define ACC_OPENCL_MEM_ALLOC(SIZE, ALIGNMENT) libxsmm_aligned_malloc(SIZE, ALIGNMENT) -# define ACC_OPENCL_MEM_FREE(PTR) libxsmm_free(PTR) -# else -# define ACC_OPENCL_MEM_ALLOC(SIZE, ALIGNMENT) aligned_alloc(ALIGNMENT, SIZE) -# define ACC_OPENCL_MEM_FREE(PTR) free(PTR) -# endif -# endif -# if !defined(ACC_OPENCL_MEM_ALIGNSCALE) -# define ACC_OPENCL_MEM_ALIGNSCALE 8 -# endif -# if !defined(ACC_OPENCL_MEM_SVM_INTEL) && 0 -# define ACC_OPENCL_MEM_SVM_INTEL -# endif -# if !defined(ACC_OPENCL_MEM_HST_INTEL) && 0 -# define ACC_OPENCL_MEM_HST_INTEL -# endif -# if !defined(ACC_OPENCL_MEM_SVM_USM) && 0 -# define ACC_OPENCL_MEM_SVM_USM -# endif -# if !defined(ACC_OPENCL_MEM_DEBUG) && 0 -# if && !defined(NDEBUG) -# define ACC_OPENCL_MEM_DEBUG -# endif -# endif - - -# if defined(__cplusplus) -extern "C" { -# endif - -void c_dbcsr_acc_opencl_pmalloc_init(size_t size, size_t* num, void* pool[], void* storage) { - char* p = (char*)storage; - size_t i = 0; - assert(0 < size && NULL != num && NULL != pool && NULL != storage); - for (; i < *num; ++i, p += size) pool[i] = p; -} - - -void* c_dbcsr_acc_opencl_pmalloc(ACC_OPENCL_LOCKTYPE* lock, void* pool[], size_t* i) { - void* pointer; - assert(NULL != pool && NULL != i); - if (NULL != lock) ACC_OPENCL_ACQUIRE(lock); - pointer = (0 < *i ? pool[--(*i)] : NULL); - if (NULL != lock) ACC_OPENCL_RELEASE(lock); - assert(NULL != pointer); - return pointer; -} - - -void c_dbcsr_acc_opencl_pfree(const void* pointer, void* pool[], size_t* i) { - assert(NULL != pool && NULL != i); - if (NULL != pointer) { - LIBXSMM_ASSIGN127(pool + *i, &pointer); - ++(*i); - } -} - - -c_dbcsr_acc_opencl_info_memptr_t* c_dbcsr_acc_opencl_info_hostptr(const void* memory) { - c_dbcsr_acc_opencl_info_memptr_t* result = NULL; - if (NULL == c_dbcsr_acc_opencl_config.device.clHostMemAllocINTEL && -# if (0 != ACC_OPENCL_USM) - 0 == c_dbcsr_acc_opencl_config.device.usm && -# endif - NULL != memory) - { - assert(sizeof(c_dbcsr_acc_opencl_info_memptr_t) < (uintptr_t)memory); - result = (c_dbcsr_acc_opencl_info_memptr_t*)((uintptr_t)memory - sizeof(c_dbcsr_acc_opencl_info_memptr_t)); - } - return result; -} - - -c_dbcsr_acc_opencl_info_memptr_t* c_dbcsr_acc_opencl_info_devptr_modify( - ACC_OPENCL_LOCKTYPE* lock, void* memory, size_t elsize, const size_t* amount, size_t* offset) { - c_dbcsr_acc_opencl_info_memptr_t* result = NULL; -# if !defined(ACC_OPENCL_MEM_DEBUG) - LIBXSMM_UNUSED(amount); -# endif - if (NULL != memory) { - assert(NULL != c_dbcsr_acc_opencl_config.device.context); - if (/* USM-pointer */ -# if (0 != ACC_OPENCL_USM) - 0 != c_dbcsr_acc_opencl_config.device.usm || -# endif - NULL != c_dbcsr_acc_opencl_config.device.clDeviceMemAllocINTEL) - { /* assume only first item of c_dbcsr_acc_opencl_info_memptr_t is accessed */ - assert(0 != c_dbcsr_acc_opencl_config.device.usm || NULL != c_dbcsr_acc_opencl_config.device.clDeviceMemAllocINTEL); - result = NULL; /*(c_dbcsr_acc_opencl_info_memptr_t*)memory*/ - if (NULL != offset) *offset = 0; - } - else { /* info-augmented pointer */ - const char* const pointer = (const char*)memory; - const size_t n = ACC_OPENCL_MAXNITEMS * c_dbcsr_acc_opencl_config.nthreads; - size_t hit = (size_t)-1, i; - assert(0 == c_dbcsr_acc_opencl_config.device.usm && NULL == c_dbcsr_acc_opencl_config.device.clDeviceMemAllocINTEL); - assert(NULL != c_dbcsr_acc_opencl_config.memptrs); - if (NULL != lock) ACC_OPENCL_ACQUIRE(lock); - for (i = c_dbcsr_acc_opencl_config.nmemptrs; i < n; ++i) { - c_dbcsr_acc_opencl_info_memptr_t* const info = c_dbcsr_acc_opencl_config.memptrs[i]; - if (NULL != info) { - char* const memptr = (char*)info->memptr; - if (memptr == pointer) { /* fast-path */ - if (NULL != offset) *offset = 0; - result = info; - break; - } - else if (memptr < pointer && NULL != offset) { - size_t d = pointer - memptr, s = d; - assert(0 < elsize && 0 != d); - if (d < hit && (1 == elsize || 0 == (d % elsize)) && -# if defined(ACC_OPENCL_MEM_DEBUG) /* TODO: verify enclosed conditions */ - (EXIT_SUCCESS == clGetMemObjectInfo(info->memory, CL_MEM_SIZE, sizeof(size_t), &s, NULL)) && - (NULL == amount || (*amount * elsize + d) <= s) && -# endif - (1 == elsize || 0 == (s % elsize)) && d <= s) - { - *offset = (1 == elsize ? d : (d / elsize)); - result = info; - hit = d; - } -# if defined(ACC_OPENCL_MEM_DEBUG) - else if (d < hit && 0 != c_dbcsr_acc_opencl_config.debug && 0 != c_dbcsr_acc_opencl_config.verbosity) { - fprintf(stderr, "ERROR ACC/OpenCL: memory=%p pointer=%p size=%llu offset=%llu info failed\n", - (const void*)info->memory, info->memptr, (unsigned long long)s, - (unsigned long long)(1 == elsize ? d : (d / elsize))); - } -# endif - } - } - else break; - } - if (NULL != lock) ACC_OPENCL_RELEASE(lock); - assert(NULL != result); - } - } - return result; -} - - -int c_dbcsr_acc_opencl_info_devptr_lock(c_dbcsr_acc_opencl_info_memptr_t* info, ACC_OPENCL_LOCKTYPE* lock, const void* memory, - size_t elsize, const size_t* amount, size_t* offset) { - const c_dbcsr_acc_opencl_info_memptr_t* meminfo = NULL; - int result = EXIT_SUCCESS; - void* non_const; - LIBXSMM_ASSIGN127(&non_const, &memory); - meminfo = c_dbcsr_acc_opencl_info_devptr_modify(lock, non_const, elsize, amount, offset); - assert(NULL != info); - if (NULL == meminfo) { /* USM-pointer */ - LIBXSMM_MEMZERO127(info); - info->memory = (cl_mem)non_const; - } - else { /* info-augmented pointer */ - assert(NULL != c_dbcsr_acc_opencl_config.device.context); - LIBXSMM_ASSIGN127(info, meminfo); - } - return result; -} - - -int c_dbcsr_acc_opencl_info_devptr( - c_dbcsr_acc_opencl_info_memptr_t* info, const void* memory, size_t elsize, const size_t* amount, size_t* offset) { - ACC_OPENCL_LOCKTYPE* const lock_memory = (( -# if (0 != ACC_OPENCL_USM) - 0 != c_dbcsr_acc_opencl_config.device.usm || -# endif - NULL != c_dbcsr_acc_opencl_config.device.clSetKernelArgMemPointerINTEL) - ? NULL /* no lock required */ - : c_dbcsr_acc_opencl_config.lock_memory); - return c_dbcsr_acc_opencl_info_devptr_lock(info, lock_memory, memory, elsize, amount, offset); -} - - -int c_dbcsr_acc_host_mem_deallocate_internal(void* /*host_ptr*/, cl_command_queue /*queue*/); -int c_dbcsr_acc_host_mem_deallocate_internal(void* host_ptr, cl_command_queue queue) { - const c_dbcsr_acc_opencl_device_t* const devinfo = &c_dbcsr_acc_opencl_config.device; - int result = EXIT_FAILURE; -# if (1 >= ACC_OPENCL_USM) - if (NULL != devinfo->clMemFreeINTEL) { -# if defined(ACC_OPENCL_MEM_SVM_INTEL) || defined(ACC_OPENCL_MEM_HST_INTEL) - result = devinfo->clMemFreeINTEL(devinfo->context, host_ptr); -# else - ACC_OPENCL_MEM_FREE(host_ptr); - result = EXIT_SUCCESS; -# endif - } - else -# endif -# if (0 != ACC_OPENCL_USM) && ((1 >= ACC_OPENCL_USM) || defined(ACC_OPENCL_MEM_SVM_USM)) - if (0 != devinfo->usm && 0 != devinfo->unified) - { - if (0 == ((CL_DEVICE_SVM_FINE_GRAIN_BUFFER | CL_DEVICE_SVM_FINE_GRAIN_SYSTEM) & devinfo->usm)) { - result = clEnqueueSVMUnmap(queue, host_ptr, 0, NULL, NULL); /* clSVMFree below synchronizes */ - } - else result = EXIT_SUCCESS; - clSVMFree(devinfo->context, host_ptr); - } - else -# endif - { - LIBXSMM_UNUSED(queue); - ACC_OPENCL_MEM_FREE(host_ptr); - result = EXIT_SUCCESS; - } - ACC_OPENCL_RETURN(result); -} - - -int c_dbcsr_acc_host_mem_allocate(void** host_mem, size_t nbytes, void* stream) { - int result = EXIT_SUCCESS; -# if defined(ACC_OPENCL_PROFILE_DBCSR) - int routine_handle; - if (0 != c_dbcsr_acc_opencl_config.profile) { - static const char* routine_name_ptr = LIBXSMM_FUNCNAME + ACC_OPENCL_PROFILE_DBCSR; - static const int routine_name_len = (int)sizeof(LIBXSMM_FUNCNAME) - (ACC_OPENCL_PROFILE_DBCSR + 1); - c_dbcsr_timeset((const char**)&routine_name_ptr, &routine_name_len, &routine_handle); - } -# endif - assert(NULL != host_mem); - if (0 != nbytes) { - const c_dbcsr_acc_opencl_device_t* const devinfo = &c_dbcsr_acc_opencl_config.device; - const c_dbcsr_acc_opencl_stream_t* const str = (NULL != stream ? ACC_OPENCL_STREAM(stream) - : c_dbcsr_acc_opencl_stream_default()); - int alignment = LIBXSMM_MAX(0x10000, sizeof(void*)); - void* host_ptr = NULL; - cl_mem memory = NULL; - assert(NULL != str); - if ((ACC_OPENCL_MEM_ALIGNSCALE * ACC_OPENCL_CACHELINE) <= nbytes) { - const int a = ((ACC_OPENCL_MEM_ALIGNSCALE * ACC_OPENCL_MAXALIGN) <= nbytes ? ACC_OPENCL_MAXALIGN : ACC_OPENCL_CACHELINE); - if (alignment < a) alignment = a; - } -# if !defined(ACC_OPENCL_ACTIVATE) - if (NULL == devinfo->context) { - ACC_OPENCL_EXPECT(EXIT_SUCCESS == c_dbcsr_acc_opencl_set_active_device( - c_dbcsr_acc_opencl_config.lock_main, c_dbcsr_acc_opencl_config.device_id)); - } -# endif -# if (1 >= ACC_OPENCL_USM) - if (NULL != devinfo->clMemFreeINTEL) { -# if defined(ACC_OPENCL_MEM_SVM_INTEL) - const cl_device_id device_id = c_dbcsr_acc_opencl_config.devices[c_dbcsr_acc_opencl_config.device_id]; - host_ptr = devinfo->clSharedMemAllocINTEL(devinfo->context, device_id, NULL /*properties*/, nbytes, 0 /*alignment*/, &result); -# elif defined(ACC_OPENCL_MEM_HST_INTEL) - host_ptr = devinfo->clHostMemAllocINTEL(devinfo->context, NULL /*properties*/, nbytes, 0 /*alignment*/, &result); -# else - host_ptr = ACC_OPENCL_MEM_ALLOC(nbytes, alignment); -# endif - assert(NULL != host_ptr || EXIT_SUCCESS != result); - /*if (NULL != host_ptr)*/ *host_mem = host_ptr; - } - else -# endif - if (0 != devinfo->usm) - { -# if (0 != ACC_OPENCL_USM) -# if ((1 >= ACC_OPENCL_USM) || defined(ACC_OPENCL_MEM_SVM_USM)) - if (0 != devinfo->unified) { - const int svmmem_fine = (0 != ((CL_DEVICE_SVM_FINE_GRAIN_BUFFER | CL_DEVICE_SVM_FINE_GRAIN_SYSTEM) & devinfo->usm) - ? CL_MEM_SVM_FINE_GRAIN_BUFFER - : 0); - host_ptr = clSVMAlloc(devinfo->context, CL_MEM_READ_WRITE | svmmem_fine, nbytes, 0 /*alignment*/); - if (NULL != host_ptr) { - if (0 == svmmem_fine) { - result = clEnqueueSVMMap( - str->queue, CL_TRUE /*always block*/, CL_MAP_READ | CL_MAP_WRITE, host_ptr, nbytes, 0, NULL, NULL); - } - *host_mem = host_ptr; - } - else result = EXIT_FAILURE; - } - else -# endif - { - host_ptr = ACC_OPENCL_MEM_ALLOC(nbytes, alignment); - if (NULL != host_ptr) *host_mem = host_ptr; - else result = EXIT_FAILURE; - } -# endif - } - else { - const size_t size_meminfo = sizeof(c_dbcsr_acc_opencl_info_memptr_t); - int memflags = CL_MEM_ALLOC_HOST_PTR; - nbytes += alignment + size_meminfo - 1; -# if defined(ACC_OPENCL_XHINTS) - if (0 != (8 & c_dbcsr_acc_opencl_config.xhints) && (0 != devinfo->nv || NULL != (ACC_OPENCL_XHINTS))) { - host_ptr = ACC_OPENCL_MEM_ALLOC(nbytes, alignment); - if (NULL != host_ptr) memflags = CL_MEM_USE_HOST_PTR; - } -# endif - memory = clCreateBuffer(devinfo->context, (cl_mem_flags)(CL_MEM_READ_WRITE | memflags), nbytes, host_ptr, &result); - if (EXIT_SUCCESS == result) { - void* mapped = host_ptr; - if (NULL == host_ptr) { - mapped = clEnqueueMapBuffer(str->queue, memory, CL_TRUE /*always block*/, -# if defined(ACC_OPENCL_XHINTS) && (defined(CL_VERSION_1_2) || defined(CL_MAP_WRITE_INVALIDATE_REGION)) - (32 & c_dbcsr_acc_opencl_config.xhints) ? CL_MAP_WRITE_INVALIDATE_REGION : -# endif - (CL_MAP_READ | CL_MAP_WRITE), - 0 /*offset*/, nbytes, 0, NULL, NULL, &result); - } - assert(EXIT_SUCCESS == result || NULL == mapped); - if (EXIT_SUCCESS == result) { - const uintptr_t address = (uintptr_t)mapped; - const uintptr_t aligned = LIBXSMM_UP2(address + size_meminfo, alignment); - c_dbcsr_acc_opencl_info_memptr_t* const meminfo = (c_dbcsr_acc_opencl_info_memptr_t*)(aligned - size_meminfo); - assert(address + size_meminfo <= aligned && NULL != meminfo); - meminfo->memory = memory; - meminfo->memptr = mapped; - *host_mem = (void*)aligned; - assert(meminfo == c_dbcsr_acc_opencl_info_hostptr(*host_mem)); - } - } - } - if (EXIT_SUCCESS != result) { - if (NULL != memory) ACC_OPENCL_EXPECT(EXIT_SUCCESS == clReleaseMemObject(memory)); - if (NULL != host_ptr) { - ACC_OPENCL_EXPECT(EXIT_SUCCESS == c_dbcsr_acc_host_mem_deallocate_internal(host_ptr, str->queue)); - } - *host_mem = NULL; - } - } - else *host_mem = NULL; /* consider warning */ - assert(EXIT_SUCCESS == result || NULL == *host_mem); -# if defined(ACC_OPENCL_PROFILE_DBCSR) - if (0 != c_dbcsr_acc_opencl_config.profile) c_dbcsr_timestop(&routine_handle); -# endif - ACC_OPENCL_RETURN(result); -} - - -int c_dbcsr_acc_host_mem_deallocate(void* host_mem, void* stream) { - int result = EXIT_SUCCESS; -# if defined(ACC_OPENCL_PROFILE_DBCSR) - int routine_handle; - if (0 != c_dbcsr_acc_opencl_config.profile) { - static const char* routine_name_ptr = LIBXSMM_FUNCNAME + ACC_OPENCL_PROFILE_DBCSR; - static const int routine_name_len = (int)sizeof(LIBXSMM_FUNCNAME) - (ACC_OPENCL_PROFILE_DBCSR + 1); - c_dbcsr_timeset((const char**)&routine_name_ptr, &routine_name_len, &routine_handle); - } -# endif - if (NULL != host_mem) { - const c_dbcsr_acc_opencl_stream_t* const str = (NULL != stream ? ACC_OPENCL_STREAM(stream) - : c_dbcsr_acc_opencl_stream_default()); - const c_dbcsr_acc_opencl_info_memptr_t* const meminfo = c_dbcsr_acc_opencl_info_hostptr(host_mem); - assert(NULL != str); - if (NULL == meminfo || NULL == meminfo->memory) { /* USM-pointer */ - assert(0 != c_dbcsr_acc_opencl_config.device.usm || NULL != c_dbcsr_acc_opencl_config.device.clMemFreeINTEL); - result = c_dbcsr_acc_host_mem_deallocate_internal(host_mem, str->queue); - } - else { /* info-augmented pointer */ - const c_dbcsr_acc_opencl_info_memptr_t info = *meminfo; /* copy meminfo prior to unmap */ - int result_release = EXIT_SUCCESS; - void* host_ptr = NULL; - assert(0 == c_dbcsr_acc_opencl_config.device.usm && NULL == c_dbcsr_acc_opencl_config.device.clMemFreeINTEL); - if (EXIT_SUCCESS == clGetMemObjectInfo(info.memory, CL_MEM_HOST_PTR, sizeof(void*), &host_ptr, NULL) && NULL != host_ptr) { - result = c_dbcsr_acc_host_mem_deallocate_internal(host_ptr, str->queue); - } - else { /* clReleaseMemObject later on synchronizes */ - result = clEnqueueUnmapMemObject(str->queue, info.memory, info.memptr, 0, NULL, NULL); - } - result_release = clReleaseMemObject(info.memory); - if (EXIT_SUCCESS == result) result = result_release; - } - } -# if defined(ACC_OPENCL_PROFILE_DBCSR) - if (0 != c_dbcsr_acc_opencl_config.profile) c_dbcsr_timestop(&routine_handle); -# endif - ACC_OPENCL_RETURN(result); -} - - -void CL_CALLBACK c_dbcsr_acc_memcpy_notify(cl_event /*event*/, cl_int /*event_status*/, void* /*data*/); -void CL_CALLBACK c_dbcsr_acc_memcpy_notify(cl_event event, cl_int event_status, void* data) { - int result = EXIT_SUCCESS; - const double durdev = c_dbcsr_acc_opencl_duration(event, &result); - cl_command_type type = CL_COMMAND_SVM_MEMCPY; - LIBXSMM_UNUSED(event_status); - assert(CL_COMPLETE == event_status && NULL != data && 8 == sizeof(data)); - if (EXIT_SUCCESS == result && EXIT_SUCCESS == clGetEventInfo(event, CL_EVENT_COMMAND_TYPE, sizeof(type), &type, NULL)) { - const size_t size = 0x3FFFFFFFFFFFFFFF & (size_t)data; - const int kind = (int)(((size_t)data) >> 62); - const double vals[] = {(double)size, durdev}; - const int mb = (int)((size + (1 << 19)) >> 20); - if (CL_COMMAND_WRITE_BUFFER != type && CL_COMMAND_READ_BUFFER != type && CL_COMMAND_COPY_BUFFER != type) { - switch (kind) { - case c_dbcsr_acc_event_kind_h2d: type = CL_COMMAND_WRITE_BUFFER; break; - case c_dbcsr_acc_event_kind_d2h: type = CL_COMMAND_READ_BUFFER; break; - case c_dbcsr_acc_event_kind_d2d: type = CL_COMMAND_COPY_BUFFER; break; - default: assert(c_dbcsr_acc_event_kind_none == kind); /* should not happen */ - } - } - switch (type) { - case CL_COMMAND_WRITE_BUFFER: { - assert(NULL != c_dbcsr_acc_opencl_config.hist_h2d && c_dbcsr_acc_event_kind_h2d == kind); - c_dbcsr_acc_opencl_hist_set(c_dbcsr_acc_opencl_config.lock_memory, c_dbcsr_acc_opencl_config.hist_h2d, vals); - if (0 > c_dbcsr_acc_opencl_config.profile) fprintf(stderr, "PROF ACC/OpenCL: H2D mb=%i us=%.0f\n", mb, durdev * 1E6); - } break; - case CL_COMMAND_READ_BUFFER: { - assert(NULL != c_dbcsr_acc_opencl_config.hist_d2h && c_dbcsr_acc_event_kind_d2h == kind); - c_dbcsr_acc_opencl_hist_set(c_dbcsr_acc_opencl_config.lock_memory, c_dbcsr_acc_opencl_config.hist_d2h, vals); - if (0 > c_dbcsr_acc_opencl_config.profile) fprintf(stderr, "PROF ACC/OpenCL: D2H mb=%i us=%.0f\n", mb, durdev * 1E6); - } break; - case CL_COMMAND_COPY_BUFFER: { - assert(NULL != c_dbcsr_acc_opencl_config.hist_d2d && c_dbcsr_acc_event_kind_d2d == kind); - c_dbcsr_acc_opencl_hist_set(c_dbcsr_acc_opencl_config.lock_memory, c_dbcsr_acc_opencl_config.hist_d2d, vals); - if (0 > c_dbcsr_acc_opencl_config.profile) fprintf(stderr, "PROF ACC/OpenCL: D2D mb=%i us=%.0f\n", mb, durdev * 1E6); - } break; - } - } - if (NULL != event) ACC_OPENCL_EXPECT(EXIT_SUCCESS == clReleaseEvent(event)); -} - - -int c_dbcsr_acc_dev_mem_allocate(void** dev_mem, size_t nbytes) { - /* assume no lock is needed to protect against context/device changes */ - const c_dbcsr_acc_opencl_device_t* const devinfo = &c_dbcsr_acc_opencl_config.device; - int result = EXIT_SUCCESS; - void* memptr = NULL; -# if defined(ACC_OPENCL_PROFILE_DBCSR) - int routine_handle; - if (0 != c_dbcsr_acc_opencl_config.profile) { - static const char* routine_name_ptr = LIBXSMM_FUNCNAME + ACC_OPENCL_PROFILE_DBCSR; - static const int routine_name_len = (int)sizeof(LIBXSMM_FUNCNAME) - (ACC_OPENCL_PROFILE_DBCSR + 1); - c_dbcsr_timeset((const char**)&routine_name_ptr, &routine_name_len, &routine_handle); - } -# endif -# if !defined(ACC_OPENCL_ACTIVATE) - if (NULL == devinfo->context) { - ACC_OPENCL_EXPECT(EXIT_SUCCESS == c_dbcsr_acc_opencl_set_active_device( - c_dbcsr_acc_opencl_config.lock_main, c_dbcsr_acc_opencl_config.device_id)); - } -# endif - assert(NULL != dev_mem && NULL != devinfo->context); - if (0 != nbytes) { - cl_mem memory = NULL; -# if (1 >= ACC_OPENCL_USM) - if (NULL != devinfo->clMemFreeINTEL) { - const cl_device_id device_id = c_dbcsr_acc_opencl_config.devices[c_dbcsr_acc_opencl_config.device_id]; -# if defined(ACC_OPENCL_MEM_SVM_INTEL) - memptr = devinfo->clSharedMemAllocINTEL(devinfo->context, device_id, NULL /*properties*/, nbytes, 0 /*alignment*/, &result); -# else - memptr = devinfo->clDeviceMemAllocINTEL(devinfo->context, device_id, NULL /*properties*/, nbytes, 0 /*alignment*/, &result); -# endif - *dev_mem = memptr; - } - else -# endif -# if (0 != ACC_OPENCL_USM) - if (0 != devinfo->usm) - { -# if (1 >= ACC_OPENCL_USM) || defined(ACC_OPENCL_MEM_SVM_USM) - const int svmflags = (0 != ((CL_DEVICE_SVM_FINE_GRAIN_BUFFER | CL_DEVICE_SVM_FINE_GRAIN_SYSTEM) & devinfo->usm) - ? CL_MEM_SVM_FINE_GRAIN_BUFFER - : 0); - memptr = clSVMAlloc(devinfo->context, (cl_svm_mem_flags)(CL_MEM_READ_WRITE | svmflags), nbytes, 0 /*alignment*/); -# else - int alignment = LIBXSMM_MAX(0x10000, sizeof(void*)); - if ((ACC_OPENCL_MEM_ALIGNSCALE * ACC_OPENCL_CACHELINE) <= nbytes) { - const int a = ((ACC_OPENCL_MEM_ALIGNSCALE * ACC_OPENCL_MAXALIGN) <= nbytes ? ACC_OPENCL_MAXALIGN : ACC_OPENCL_CACHELINE); - if (alignment < a) alignment = a; - } - memptr = ACC_OPENCL_MEM_ALLOC(nbytes, alignment); -# endif - *dev_mem = memptr; - } - else -# endif - { -# if defined(ACC_OPENCL_XHINTS) - const int devuid = devinfo->uid, devuids = (0x4905 == devuid || 0x020a == devuid || (0x0bd0 <= devuid && 0x0bdb >= devuid)); - const int try_flag = ((0 != (16 & c_dbcsr_acc_opencl_config.xhints) && 0 != devinfo->intel && 0 == devinfo->unified && - (devuids || NULL != (ACC_OPENCL_XHINTS))) - ? (1u << 22) - : 0); - memory = clCreateBuffer(devinfo->context, (cl_mem_flags)(CL_MEM_READ_WRITE | try_flag), nbytes, NULL /*host_ptr*/, &result); - if (0 != try_flag && EXIT_SUCCESS != result) /* retry without try_flag */ -# endif - { - memory = clCreateBuffer(devinfo->context, CL_MEM_READ_WRITE, nbytes, NULL /*host_ptr*/, &result); - } - if (EXIT_SUCCESS == result) { - const c_dbcsr_acc_opencl_stream_t* str = NULL; - static cl_kernel kernel = NULL; - const size_t size = 1; - ACC_OPENCL_ACQUIRE(c_dbcsr_acc_opencl_config.lock_memory); - str = c_dbcsr_acc_opencl_stream(NULL /*lock*/, ACC_OPENCL_OMP_TID()); - assert(NULL != str && NULL != memory); - /* determine device-side value of device-memory object by running some kernel */ - if (NULL == kernel) { /* generate kernel */ - const char source[] = "kernel void memptr(global unsigned long* ptr) {\n" - " const union { global unsigned long* p; unsigned long u; } cast = { ptr };\n" - " const size_t i = get_global_id(0);\n" - " ptr[i] = cast.u + i;\n" - "}\n"; - assert(sizeof(size_t) == sizeof(cl_ulong)); - result = c_dbcsr_acc_opencl_kernel(0 /*source_kind*/, source, "memptr" /*kernel_name*/, NULL /*build_params*/, - NULL /*build_options*/, NULL /*try_build_options*/, NULL /*try_ok*/, NULL /*extnames*/, 0 /*num_exts*/, &kernel); - } - /* TODO: backup/restore memory */ - if (EXIT_SUCCESS == result) result = clSetKernelArg(kernel, 0, sizeof(cl_mem), &memory); - if (EXIT_SUCCESS == result) { - result = clEnqueueNDRangeKernel( - str->queue, kernel, 1 /*work_dim*/, NULL /*offset*/, &size, NULL /*local_work_size*/, 0, NULL, NULL); - } - ACC_OPENCL_RELEASE(c_dbcsr_acc_opencl_config.lock_memory); - if (EXIT_SUCCESS == result) { - result = clEnqueueReadBuffer( - str->queue, memory, CL_TRUE /*blocking*/, 0 /*offset*/, sizeof(void*), &memptr, 0, NULL, NULL /*event*/); - } - assert(EXIT_SUCCESS != result || NULL != memptr); - if (EXIT_SUCCESS == result) { - c_dbcsr_acc_opencl_info_memptr_t* const info = (c_dbcsr_acc_opencl_info_memptr_t*)c_dbcsr_acc_opencl_pmalloc( - c_dbcsr_acc_opencl_config.lock_memory, (void**)c_dbcsr_acc_opencl_config.memptrs, &c_dbcsr_acc_opencl_config.nmemptrs); - if (NULL != info) { - info->memory = memory; - info->memptr = memptr; - *dev_mem = memptr; - } - else result = EXIT_FAILURE; - } - } - } - if (EXIT_SUCCESS != result) { - if (0 != c_dbcsr_acc_opencl_config.verbosity) { - fprintf(stderr, "ERROR ACC/OpenCL: memory=%p pointer=%p size=%llu failed to allocate\n", (const void*)memory, memptr, - (unsigned long long)nbytes); - } - if (NULL != memory) ACC_OPENCL_EXPECT(EXIT_SUCCESS == clReleaseMemObject(memory)); - *dev_mem = NULL; - } - } - else *dev_mem = NULL; - assert(EXIT_SUCCESS == result || NULL == *dev_mem); -# if defined(ACC_OPENCL_PROFILE_DBCSR) - if (0 != c_dbcsr_acc_opencl_config.profile) c_dbcsr_timestop(&routine_handle); -# endif - ACC_OPENCL_RETURN(result); -} - - -int c_dbcsr_acc_dev_mem_deallocate(void* dev_mem) { - int result = EXIT_SUCCESS; -# if defined(ACC_OPENCL_PROFILE_DBCSR) - int routine_handle; - if (0 != c_dbcsr_acc_opencl_config.profile) { - static const char* routine_name_ptr = LIBXSMM_FUNCNAME + ACC_OPENCL_PROFILE_DBCSR; - static const int routine_name_len = (int)sizeof(LIBXSMM_FUNCNAME) - (ACC_OPENCL_PROFILE_DBCSR + 1); - c_dbcsr_timeset((const char**)&routine_name_ptr, &routine_name_len, &routine_handle); - } -# endif - if (NULL != dev_mem) { - assert(NULL != c_dbcsr_acc_opencl_config.device.context); -# if (1 >= ACC_OPENCL_USM) - if (NULL != c_dbcsr_acc_opencl_config.device.clMemFreeINTEL) { - result = c_dbcsr_acc_opencl_config.device.clMemFreeINTEL(c_dbcsr_acc_opencl_config.device.context, dev_mem); - } - else -# endif -# if (0 != ACC_OPENCL_USM) - if (0 != c_dbcsr_acc_opencl_config.device.usm) - { -# if (1 >= ACC_OPENCL_USM) || defined(ACC_OPENCL_MEM_SVM_USM) - clSVMFree(c_dbcsr_acc_opencl_config.device.context, dev_mem); -# else - ACC_OPENCL_MEM_FREE(dev_mem); -# endif - } - else -# endif - { - c_dbcsr_acc_opencl_info_memptr_t* info = NULL; - ACC_OPENCL_ACQUIRE(c_dbcsr_acc_opencl_config.lock_memory); - info = c_dbcsr_acc_opencl_info_devptr_modify(NULL, dev_mem, 1 /*elsize*/, NULL /*amount*/, NULL /*offset*/); - if (NULL != info && info->memptr == dev_mem && NULL != info->memory) { - c_dbcsr_acc_opencl_info_memptr_t* const pfree = c_dbcsr_acc_opencl_config.memptrs[c_dbcsr_acc_opencl_config.nmemptrs]; - result = clReleaseMemObject(info->memory); - c_dbcsr_acc_opencl_pfree(pfree, (void**)c_dbcsr_acc_opencl_config.memptrs, &c_dbcsr_acc_opencl_config.nmemptrs); - *info = *pfree; - LIBXSMM_MEMZERO127(pfree); - } - else result = EXIT_FAILURE; - ACC_OPENCL_RELEASE(c_dbcsr_acc_opencl_config.lock_memory); - } - } -# if defined(ACC_OPENCL_PROFILE_DBCSR) - if (0 != c_dbcsr_acc_opencl_config.profile) c_dbcsr_timestop(&routine_handle); -# endif - ACC_OPENCL_RETURN(result); -} - - -int c_dbcsr_acc_dev_mem_set_ptr(void** dev_mem, void* other, size_t offset) { - int result = EXIT_SUCCESS; -# if defined(ACC_OPENCL_PROFILE_DBCSR) - int routine_handle; - if (0 != c_dbcsr_acc_opencl_config.profile) { - static const char* routine_name_ptr = LIBXSMM_FUNCNAME + ACC_OPENCL_PROFILE_DBCSR; - static const int routine_name_len = (int)sizeof(LIBXSMM_FUNCNAME) - (ACC_OPENCL_PROFILE_DBCSR + 1); - c_dbcsr_timeset((const char**)&routine_name_ptr, &routine_name_len, &routine_handle); - } -# endif - assert(NULL != dev_mem); - if (NULL != other || 0 == offset) { - *dev_mem = (char*)other + offset; - } - else { - result = EXIT_FAILURE; - *dev_mem = NULL; - } -# if defined(ACC_OPENCL_PROFILE_DBCSR) - if (0 != c_dbcsr_acc_opencl_config.profile) c_dbcsr_timestop(&routine_handle); -# endif - ACC_OPENCL_RETURN(result); -} - - -int c_dbcsr_acc_memcpy_h2d(const void* host_mem, void* dev_mem, size_t nbytes, void* stream) { - const c_dbcsr_acc_opencl_device_t* const devinfo = &c_dbcsr_acc_opencl_config.device; - int result = EXIT_SUCCESS; -# if defined(ACC_OPENCL_PROFILE_DBCSR) - int routine_handle; - if (0 != c_dbcsr_acc_opencl_config.profile) { - static const char* routine_name_ptr = LIBXSMM_FUNCNAME + ACC_OPENCL_PROFILE_DBCSR; - static const int routine_name_len = (int)sizeof(LIBXSMM_FUNCNAME) - (ACC_OPENCL_PROFILE_DBCSR + 1); - c_dbcsr_timeset((const char**)&routine_name_ptr, &routine_name_len, &routine_handle); - } -# endif - assert((NULL != host_mem && NULL != dev_mem) || 0 == nbytes); - assert(NULL != devinfo->context); - if ( -# if (0 != ACC_OPENCL_USM) - host_mem != dev_mem && /* fast-path only sensible without offsets */ -# endif - NULL != host_mem && NULL != dev_mem && 0 != nbytes) - { -# if defined(ACC_OPENCL_ASYNC) - const cl_bool finish = (0 == (1 & c_dbcsr_acc_opencl_config.async) || NULL == stream || - (0 != (8 & c_dbcsr_acc_opencl_config.wa) && 0 != devinfo->intel && 0 != devinfo->unified)); -# else - const cl_bool finish = CL_TRUE; -# endif - const c_dbcsr_acc_opencl_stream_t* str; - cl_event event = NULL; - ACC_OPENCL_ACQUIRE(c_dbcsr_acc_opencl_config.lock_memory); - str = (NULL != stream ? ACC_OPENCL_STREAM(stream) : c_dbcsr_acc_opencl_stream(NULL, ACC_OPENCL_OMP_TID())); - assert(NULL != str); -# if (1 >= ACC_OPENCL_USM) - if (NULL != devinfo->clEnqueueMemcpyINTEL) { - result = devinfo->clEnqueueMemcpyINTEL( - str->queue, finish, dev_mem, host_mem, nbytes, 0, NULL, NULL == c_dbcsr_acc_opencl_config.hist_h2d ? NULL : &event); - } - else -# endif -# if (0 != ACC_OPENCL_USM) - if (0 != devinfo->usm) - { -# if (1 >= ACC_OPENCL_USM) || defined(ACC_OPENCL_MEM_SVM_USM) - result = clEnqueueSVMMemcpy( - str->queue, finish, dev_mem, host_mem, nbytes, 0, NULL, NULL == c_dbcsr_acc_opencl_config.hist_h2d ? NULL : &event); -# else - memcpy(dev_mem, host_mem, nbytes); -# endif - } - else -# endif - { - size_t offset = 0; - c_dbcsr_acc_opencl_info_memptr_t* const info = c_dbcsr_acc_opencl_info_devptr_modify( - NULL, dev_mem, 1 /*elsize*/, &nbytes, &offset); - if (NULL != info) { - result = clEnqueueWriteBuffer(str->queue, info->memory, finish, offset, nbytes, host_mem, 0, NULL, - NULL == c_dbcsr_acc_opencl_config.hist_h2d ? NULL : &event); - } - else result = EXIT_FAILURE; - } - ACC_OPENCL_RELEASE(c_dbcsr_acc_opencl_config.lock_memory); - if (NULL != event) { /* c_dbcsr_acc_memcpy_notify must be outside of locked region */ - if (EXIT_SUCCESS == result) { - void* const data = (void*)(nbytes | ((size_t)c_dbcsr_acc_event_kind_h2d) << 62); - assert(NULL != c_dbcsr_acc_opencl_config.hist_h2d); - if (!finish) { /* asynchronous */ - result = clSetEventCallback(event, CL_COMPLETE, c_dbcsr_acc_memcpy_notify, data); - } - else c_dbcsr_acc_memcpy_notify(event, CL_COMPLETE, data); /* synchronous */ - } - else ACC_OPENCL_EXPECT(EXIT_SUCCESS == clReleaseEvent(event)); - } - } -# if defined(ACC_OPENCL_PROFILE_DBCSR) - if (0 != c_dbcsr_acc_opencl_config.profile) c_dbcsr_timestop(&routine_handle); -# endif - ACC_OPENCL_RETURN(result); -} - - -/* like c_dbcsr_acc_memcpy_d2h, but apply some async workaround. */ -int c_dbcsr_acc_opencl_memcpy_d2h(const void* /*dev_mem*/, void* /*host_mem*/, size_t /*offset*/, size_t /*nbytes*/, - cl_command_queue /*queue*/, int /*blocking*/, cl_event* /*event*/); -int c_dbcsr_acc_opencl_memcpy_d2h( - const void* dev_mem, void* host_mem, size_t offset, size_t nbytes, cl_command_queue queue, int blocking, cl_event* event) { - const c_dbcsr_acc_opencl_device_t* const devinfo = &c_dbcsr_acc_opencl_config.device; -# if defined(ACC_OPENCL_ASYNC) - const cl_bool finish = (0 != blocking || 0 == (2 & c_dbcsr_acc_opencl_config.async) || - (0 != (8 & c_dbcsr_acc_opencl_config.wa) && 0 != devinfo->intel && 0 != devinfo->unified)); -# else - const cl_bool finish = CL_TRUE; -# endif - int result = EXIT_SUCCESS; - assert(NULL != dev_mem); -# if (1 >= ACC_OPENCL_USM) - if (NULL != devinfo->clEnqueueMemcpyINTEL) { - result = devinfo->clEnqueueMemcpyINTEL(queue, finish, host_mem, (const char*)dev_mem + offset, nbytes, 0, NULL, event); - } - else -# endif -# if (0 != ACC_OPENCL_USM) - if (0 != devinfo->usm) - { -# if (1 >= ACC_OPENCL_USM) || defined(ACC_OPENCL_MEM_SVM_USM) - result = clEnqueueSVMMemcpy(queue, finish, host_mem, (const char*)dev_mem + offset, nbytes, 0, NULL, event); -# else - memcpy(host_mem, (const char*)dev_mem + offset, nbytes); -# endif - } - else -# endif - { - result = clEnqueueReadBuffer(queue, (cl_mem)(uintptr_t)dev_mem, finish, offset, nbytes, host_mem, 0, NULL, event); - } - if (EXIT_SUCCESS != result && !finish) { /* retry synchronously */ - int result_sync = EXIT_FAILURE; -# if (1 >= ACC_OPENCL_USM) - if (NULL != devinfo->clEnqueueMemcpyINTEL) { - result_sync = devinfo->clEnqueueMemcpyINTEL(queue, CL_TRUE, host_mem, (const char*)dev_mem + offset, nbytes, 0, NULL, event); - } - else -# endif -# if (0 != ACC_OPENCL_USM) - if (0 != devinfo->usm) - { -# if (1 >= ACC_OPENCL_USM) || defined(ACC_OPENCL_MEM_SVM_USM) - result_sync = clEnqueueSVMMemcpy(queue, CL_TRUE, host_mem, (const char*)dev_mem + offset, nbytes, 0, NULL, event); -# else - memcpy(host_mem, (const char*)dev_mem + offset, nbytes); -# endif - } - else -# endif - { - result_sync = clEnqueueReadBuffer(queue, (cl_mem)(uintptr_t)dev_mem, CL_TRUE, offset, nbytes, host_mem, 0, NULL, event); - } - if (EXIT_SUCCESS == result_sync) { - c_dbcsr_acc_opencl_config.async &= ~2; /* retract async feature */ - if (0 != c_dbcsr_acc_opencl_config.verbosity) { - fprintf(stderr, "WARN ACC/OpenCL: falling back to synchronous readback (code=%i).\n", result); - } - result = EXIT_SUCCESS; - } - } - return result; -} - - -int c_dbcsr_acc_memcpy_d2h(const void* dev_mem, void* host_mem, size_t nbytes, void* stream) { - int result = EXIT_SUCCESS; -# if defined(ACC_OPENCL_PROFILE_DBCSR) - int routine_handle; - if (0 != c_dbcsr_acc_opencl_config.profile) { - static const char* routine_name_ptr = LIBXSMM_FUNCNAME + ACC_OPENCL_PROFILE_DBCSR; - static const int routine_name_len = (int)sizeof(LIBXSMM_FUNCNAME) - (ACC_OPENCL_PROFILE_DBCSR + 1); - c_dbcsr_timeset((const char**)&routine_name_ptr, &routine_name_len, &routine_handle); - } -# endif - assert((NULL != dev_mem && NULL != host_mem) || 0 == nbytes); - if ( -# if (0 != ACC_OPENCL_USM) - host_mem != dev_mem && /* fast-path only sensible without offsets */ -# endif - NULL != host_mem && NULL != dev_mem && 0 != nbytes) - { - const cl_bool finish = (NULL != stream ? CL_FALSE : CL_TRUE); - c_dbcsr_acc_opencl_info_memptr_t* info = NULL; - cl_event event = NULL; - size_t offset = 0; - union { - const void* input; - void* ptr; - } nconst = {dev_mem}; - const c_dbcsr_acc_opencl_stream_t* str; - ACC_OPENCL_ACQUIRE(c_dbcsr_acc_opencl_config.lock_memory); - str = (NULL != stream ? ACC_OPENCL_STREAM(stream) : c_dbcsr_acc_opencl_stream(NULL, ACC_OPENCL_OMP_TID())); - assert(NULL != str); - info = c_dbcsr_acc_opencl_info_devptr_modify(NULL, nconst.ptr, 1 /*elsize*/, &nbytes, &offset); - if (NULL == info) { - result = c_dbcsr_acc_opencl_memcpy_d2h( - dev_mem, host_mem, offset, nbytes, str->queue, finish, NULL == c_dbcsr_acc_opencl_config.hist_d2h ? NULL : &event); - } - else { - result = c_dbcsr_acc_opencl_memcpy_d2h( - info->memory, host_mem, offset, nbytes, str->queue, finish, NULL == c_dbcsr_acc_opencl_config.hist_d2h ? NULL : &event); - } - ACC_OPENCL_RELEASE(c_dbcsr_acc_opencl_config.lock_memory); - if (NULL != event) { /* c_dbcsr_acc_memcpy_notify must be outside of locked region */ - if (EXIT_SUCCESS == result) { - void* const data = (void*)(nbytes | ((size_t)c_dbcsr_acc_event_kind_d2h) << 62); - assert(NULL != c_dbcsr_acc_opencl_config.hist_d2h); - if (!finish) { /* asynchronous */ - result = clSetEventCallback(event, CL_COMPLETE, c_dbcsr_acc_memcpy_notify, data); - } - else c_dbcsr_acc_memcpy_notify(event, CL_COMPLETE, data); /* synchronous */ - } - else ACC_OPENCL_EXPECT(EXIT_SUCCESS == clReleaseEvent(event)); - } - } -# if defined(ACC_OPENCL_PROFILE_DBCSR) - if (0 != c_dbcsr_acc_opencl_config.profile) c_dbcsr_timestop(&routine_handle); -# endif - ACC_OPENCL_RETURN(result); -} - - -int c_dbcsr_acc_memcpy_d2d(const void* devmem_src, void* devmem_dst, size_t nbytes, void* stream) { - int result = EXIT_SUCCESS; -# if defined(ACC_OPENCL_PROFILE_DBCSR) - int routine_handle; - if (0 != c_dbcsr_acc_opencl_config.profile) { - static const char* routine_name_ptr = LIBXSMM_FUNCNAME + ACC_OPENCL_PROFILE_DBCSR; - static const int routine_name_len = (int)sizeof(LIBXSMM_FUNCNAME) - (ACC_OPENCL_PROFILE_DBCSR + 1); - c_dbcsr_timeset((const char**)&routine_name_ptr, &routine_name_len, &routine_handle); - } -# endif - assert((NULL != devmem_src && NULL != devmem_dst) || 0 == nbytes); - if (NULL != devmem_src && devmem_src != devmem_dst && 0 != nbytes) { -# if defined(ACC_OPENCL_ASYNC) - cl_event event = NULL, *const pevent = (0 == (4 & c_dbcsr_acc_opencl_config.async) || NULL == stream) ? &event : NULL; -# else - cl_event event = NULL, *const pevent = NULL; -# endif - const c_dbcsr_acc_opencl_device_t* const devinfo = &c_dbcsr_acc_opencl_config.device; - union { - const void* input; - void* ptr; - } nconst = {devmem_src}; - const c_dbcsr_acc_opencl_stream_t* str; - ACC_OPENCL_ACQUIRE(c_dbcsr_acc_opencl_config.lock_memory); - str = (NULL != stream ? ACC_OPENCL_STREAM(stream) : c_dbcsr_acc_opencl_stream(NULL, ACC_OPENCL_OMP_TID())); - assert(NULL != str && NULL != devinfo->context); -# if (1 >= ACC_OPENCL_USM) - if (NULL != devinfo->clEnqueueMemcpyINTEL) { - result = devinfo->clEnqueueMemcpyINTEL(str->queue, CL_FALSE /*blocking*/, devmem_dst, devmem_src, nbytes, 0, NULL, - NULL == c_dbcsr_acc_opencl_config.hist_d2d ? pevent : &event); - } - else -# endif -# if (0 != ACC_OPENCL_USM) - if (0 != devinfo->usm) - { -# if (1 >= ACC_OPENCL_USM) || defined(ACC_OPENCL_MEM_SVM_USM) - result = clEnqueueSVMMemcpy(str->queue, CL_FALSE /*blocking*/, devmem_dst, devmem_src, nbytes, 0, NULL, - NULL == c_dbcsr_acc_opencl_config.hist_d2d ? pevent : &event); -# else - memcpy(devmem_dst, devmem_src, nbytes); -# endif - } - else -# endif - { - size_t offset_src = 0, offset_dst = 0; - c_dbcsr_acc_opencl_info_memptr_t* const info_src = c_dbcsr_acc_opencl_info_devptr_modify( - NULL, nconst.ptr, 1 /*elsize*/, &nbytes, &offset_src); - c_dbcsr_acc_opencl_info_memptr_t* const info_dst = c_dbcsr_acc_opencl_info_devptr_modify( - NULL, devmem_dst, 1 /*elsize*/, &nbytes, &offset_dst); - if (NULL != info_src && NULL != info_dst) { - result = clEnqueueCopyBuffer(str->queue, info_src->memory, info_dst->memory, offset_src, offset_dst, nbytes, 0, NULL, - NULL == c_dbcsr_acc_opencl_config.hist_d2d ? pevent : &event); - } - else result = EXIT_FAILURE; - } - ACC_OPENCL_RELEASE(c_dbcsr_acc_opencl_config.lock_memory); - if (NULL != event) { /* c_dbcsr_acc_memcpy_notify must be outside of locked region */ - if (EXIT_SUCCESS == result) { - void* const data = (void*)(nbytes | ((size_t)c_dbcsr_acc_event_kind_d2d) << 62); - if (NULL == pevent) { /* asynchronous */ - assert(NULL != c_dbcsr_acc_opencl_config.hist_d2d); - result = clSetEventCallback(event, CL_COMPLETE, c_dbcsr_acc_memcpy_notify, data); - } - else { /* synchronous */ - result = clWaitForEvents(1, &event); - if (EXIT_SUCCESS == result) { - if (NULL != c_dbcsr_acc_opencl_config.hist_d2d) { - c_dbcsr_acc_memcpy_notify(event, CL_COMPLETE, data); - } - else result = clReleaseEvent(event); - } - else ACC_OPENCL_EXPECT(EXIT_SUCCESS == clReleaseEvent(event)); - } - } - else ACC_OPENCL_EXPECT(EXIT_SUCCESS == clReleaseEvent(event)); - } - } -# if defined(ACC_OPENCL_PROFILE_DBCSR) - if (0 != c_dbcsr_acc_opencl_config.profile) c_dbcsr_timestop(&routine_handle); -# endif - ACC_OPENCL_RETURN(result); -} - - -int c_dbcsr_acc_opencl_memset(void* dev_mem, int value, size_t offset, size_t nbytes, void* stream) { - int result = EXIT_SUCCESS; -# if defined(ACC_OPENCL_PROFILE_DBCSR) - int routine_handle; - if (0 != c_dbcsr_acc_opencl_config.profile) { - static const char* routine_name_ptr = LIBXSMM_FUNCNAME + ACC_OPENCL_PROFILE_DBCSR; - static const int routine_name_len = (int)sizeof(LIBXSMM_FUNCNAME) - (ACC_OPENCL_PROFILE_DBCSR + 1); - c_dbcsr_timeset((const char**)&routine_name_ptr, &routine_name_len, &routine_handle); - } -# endif - assert(NULL != dev_mem || 0 == nbytes); - if (0 != nbytes) { -# if defined(ACC_OPENCL_ASYNC) - cl_event event = NULL, *const pevent = (0 == (8 & c_dbcsr_acc_opencl_config.async) || NULL == stream) ? &event : NULL; -# else - cl_event event = NULL, *const pevent = NULL; -# endif - const c_dbcsr_acc_opencl_device_t* const devinfo = &c_dbcsr_acc_opencl_config.device; - const c_dbcsr_acc_opencl_stream_t* str; - size_t base = 0, vsize = 1; - if (0 == LIBXSMM_MOD2(nbytes, 4)) vsize = 4; - else if (0 == LIBXSMM_MOD2(nbytes, 2)) vsize = 2; - ACC_OPENCL_ACQUIRE(c_dbcsr_acc_opencl_config.lock_memory); - str = (NULL != stream ? ACC_OPENCL_STREAM(stream) : c_dbcsr_acc_opencl_stream(NULL, ACC_OPENCL_OMP_TID())); - assert(NULL != str && NULL != devinfo->context); -# if (1 >= ACC_OPENCL_USM) - if (NULL != devinfo->clEnqueueMemFillINTEL) { - result = devinfo->clEnqueueMemFillINTEL(str->queue, (char*)dev_mem + offset, &value, vsize, nbytes, 0, NULL, pevent); - } - else -# endif -# if (0 != ACC_OPENCL_USM) - if (0 != devinfo->usm) - { -# if (1 >= ACC_OPENCL_USM) || defined(ACC_OPENCL_MEM_SVM_USM) - result = clEnqueueSVMMemFill(str->queue, (char*)dev_mem + offset, &value, vsize, nbytes, 0, NULL, pevent); -# else - memset((char*)dev_mem + offset, value, nbytes); -# endif - } - else -# endif - { - const c_dbcsr_acc_opencl_info_memptr_t* const info = c_dbcsr_acc_opencl_info_devptr_modify( - NULL, dev_mem, 1 /*elsize*/, &nbytes, &base); - if (NULL != info) { - result = clEnqueueFillBuffer(str->queue, info->memory, &value, vsize, base + offset, nbytes, 0, NULL, pevent); - dev_mem = info->memptr; - } - else result = EXIT_FAILURE; - } - ACC_OPENCL_RELEASE(c_dbcsr_acc_opencl_config.lock_memory); - if (NULL != event) { - int result_release; - if (EXIT_SUCCESS == result) result = clWaitForEvents(1, &event); - result_release = clReleaseEvent(event); - if (EXIT_SUCCESS == result) result = result_release; - } - } -# if defined(ACC_OPENCL_PROFILE_DBCSR) - if (0 != c_dbcsr_acc_opencl_config.profile) c_dbcsr_timestop(&routine_handle); -# endif - ACC_OPENCL_RETURN(result); -} - - -int c_dbcsr_acc_memset_zero(void* dev_mem, size_t offset, size_t nbytes, void* stream) { - return c_dbcsr_acc_opencl_memset(dev_mem, 0 /*value*/, offset, nbytes, stream); -} - - -int c_dbcsr_acc_opencl_info_devmem(cl_device_id device, size_t* mem_free, size_t* mem_total, size_t* mem_local, int* mem_unified) { - int result = EXIT_SUCCESS, unified = 0; - size_t size_free = 0, size_total = 0, size_local = 0; - cl_device_local_mem_type cl_local_type = CL_GLOBAL; - cl_ulong cl_size_total = 0, cl_size_local = 0; - cl_bool cl_unified = CL_FALSE; -# if !defined(_WIN32) -# if defined(_SC_PAGE_SIZE) - const long page_size = sysconf(_SC_PAGE_SIZE); -# else - const long page_size = 4096; -# endif - long pages_free = 0, pages_total = 0; -# if defined(__linux__) -# if defined(_SC_PHYS_PAGES) - pages_total = sysconf(_SC_PHYS_PAGES); -# else - pages_total = 0; -# endif -# if defined(_SC_AVPHYS_PAGES) - pages_free = sysconf(_SC_AVPHYS_PAGES); -# else - pages_free = pages_total; -# endif -# elif defined(__APPLE__) && defined(__MACH__) - /*const*/ size_t size_pages_free = sizeof(const long), size_pages_total = sizeof(const long); - ACC_OPENCL_EXPECT(0 == sysctlbyname("hw.memsize", &pages_total, &size_pages_total, NULL, 0)); - if (0 < page_size) pages_total /= page_size; - if (0 != sysctlbyname("vm.page_free_count", &pages_free, &size_pages_free, NULL, 0)) { - pages_free = pages_total; - } -# endif - if (0 < page_size && 0 <= pages_free && 0 <= pages_total) { - const size_t size_page = (size_t)page_size; - size_total = size_page * (size_t)pages_total; - size_free = size_page * (size_t)pages_free; - } -# else - MEMORYSTATUSEX mem_status; - mem_status.dwLength = sizeof(mem_status); - if (GlobalMemoryStatusEx(&mem_status)) { - size_total = (size_t)mem_status.ullTotalPhys; - size_free = (size_t)mem_status.ullAvailPhys; - } -# endif - ACC_OPENCL_CHECK(result, clGetDeviceInfo(device, CL_DEVICE_GLOBAL_MEM_SIZE, sizeof(cl_ulong), &cl_size_total, NULL), - "retrieve amount of global memory"); - ACC_OPENCL_CHECK(result, - clGetDeviceInfo(device, CL_DEVICE_LOCAL_MEM_TYPE, sizeof(cl_device_local_mem_type), &cl_local_type, NULL), - "retrieve kind of local memory"); - if (CL_LOCAL == cl_local_type) { - ACC_OPENCL_CHECK(result, clGetDeviceInfo(device, CL_DEVICE_LOCAL_MEM_SIZE, sizeof(cl_ulong), &cl_size_local, NULL), - "retrieve amount of local memory"); - } - ACC_OPENCL_CHECK(result, clGetDeviceInfo(device, CL_DEVICE_HOST_UNIFIED_MEMORY, sizeof(cl_bool), &cl_unified, NULL), - "retrieve if host memory is unified"); - if (EXIT_SUCCESS == result) { - if (cl_size_total < size_total) size_total = cl_size_total; - if (size_total < size_free) size_free = size_total; - size_local = cl_size_local; - unified = cl_unified; - assert(size_free <= size_total); - } - assert(NULL != mem_local || NULL != mem_total || NULL != mem_free || NULL != mem_unified); - if (NULL != mem_unified) *mem_unified = unified; - if (NULL != mem_local) *mem_local = size_local; - if (NULL != mem_total) *mem_total = size_total; - if (NULL != mem_free) *mem_free = size_free; - return result; -} - - -int c_dbcsr_acc_dev_mem_info(size_t* mem_free, size_t* mem_total) { - const cl_device_id device_id = c_dbcsr_acc_opencl_config.devices[c_dbcsr_acc_opencl_config.device_id]; - int result; -# if defined(ACC_OPENCL_PROFILE_DBCSR) - int routine_handle; - if (0 != c_dbcsr_acc_opencl_config.profile) { - static const char* routine_name_ptr = LIBXSMM_FUNCNAME + ACC_OPENCL_PROFILE_DBCSR; - static const int routine_name_len = (int)sizeof(LIBXSMM_FUNCNAME) - (ACC_OPENCL_PROFILE_DBCSR + 1); - c_dbcsr_timeset((const char**)&routine_name_ptr, &routine_name_len, &routine_handle); - } -# endif - result = c_dbcsr_acc_opencl_info_devmem(device_id, mem_free, mem_total, NULL /*mem_local*/, NULL /*mem_unified*/); -# if defined(ACC_OPENCL_PROFILE_DBCSR) - if (0 != c_dbcsr_acc_opencl_config.profile) c_dbcsr_timestop(&routine_handle); -# endif - ACC_OPENCL_RETURN(result); -} - -# if defined(__cplusplus) -} -# endif - -#endif /*__OPENCL*/ diff --git a/src/acc/opencl/acc_opencl_stream.c b/src/acc/opencl/acc_opencl_stream.c deleted file mode 100644 index c33f143ed4c..00000000000 --- a/src/acc/opencl/acc_opencl_stream.c +++ /dev/null @@ -1,367 +0,0 @@ -/*------------------------------------------------------------------------------------------------*/ -/* Copyright (C) by the DBCSR developers group - All rights reserved */ -/* This file is part of the DBCSR library. */ -/* */ -/* For information on the license, see the LICENSE file. */ -/* For further information please visit https://dbcsr.cp2k.org */ -/* SPDX-License-Identifier: BSD-3-Clause */ -/*------------------------------------------------------------------------------------------------*/ -#if defined(__OPENCL) -# include "acc_opencl.h" -# include - - -# if defined(__cplusplus) -extern "C" { -# endif - - -const c_dbcsr_acc_opencl_stream_t* c_dbcsr_acc_opencl_stream(ACC_OPENCL_LOCKTYPE* lock, int thread_id) { - const c_dbcsr_acc_opencl_stream_t *result = NULL, *result_main = NULL; - const size_t n = ACC_OPENCL_MAXNITEMS * c_dbcsr_acc_opencl_config.nthreads; - size_t i; - assert(NULL != c_dbcsr_acc_opencl_config.streams); - assert(thread_id < c_dbcsr_acc_opencl_config.nthreads); - if (NULL != lock) ACC_OPENCL_ACQUIRE(lock); - for (i = c_dbcsr_acc_opencl_config.nstreams; i < n; ++i) { - const c_dbcsr_acc_opencl_stream_t* const str = c_dbcsr_acc_opencl_config.streams[i]; - if (NULL != str && NULL != str->queue) { - if (str->tid == thread_id || 0 > thread_id) { /* hit */ - result = str; - break; - } - else if (NULL == result_main && 0 == str->tid) { - result_main = str; - } - } - else break; /* error */ - } - if (NULL == result) { /* fallback */ - assert(NULL != c_dbcsr_acc_opencl_config.device.context); - result = (NULL != result_main ? result_main : &c_dbcsr_acc_opencl_config.device.stream); - } - if (NULL != lock) ACC_OPENCL_RELEASE(lock); - return result; -} - - -const c_dbcsr_acc_opencl_stream_t* c_dbcsr_acc_opencl_stream_default(void) { - const c_dbcsr_acc_opencl_stream_t* result = NULL; - result = c_dbcsr_acc_opencl_stream(c_dbcsr_acc_opencl_config.lock_stream, ACC_OPENCL_OMP_TID()); - assert(NULL != result); - return result; -} - - -int c_dbcsr_acc_stream_create(void** stream_p, const char* name, int priority) { - const c_dbcsr_acc_opencl_device_t* const devinfo = &c_dbcsr_acc_opencl_config.device; - ACC_OPENCL_STREAM_PROPERTIES_TYPE properties[8] = { - CL_QUEUE_PROPERTIES, 0 /*placeholder*/, 0 /* terminator */ - }; - int result, tid = 0, offset = 0; - cl_command_queue queue = NULL; -# if defined(ACC_OPENCL_PROFILE_DBCSR) - int routine_handle; - if (0 != c_dbcsr_acc_opencl_config.profile) { - static const char* routine_name_ptr = LIBXSMM_FUNCNAME + ACC_OPENCL_PROFILE_DBCSR; - static const int routine_name_len = (int)sizeof(LIBXSMM_FUNCNAME) - (ACC_OPENCL_PROFILE_DBCSR + 1); - c_dbcsr_timeset((const char**)&routine_name_ptr, &routine_name_len, &routine_handle); - } -# endif - assert(NULL != stream_p); -# if !defined(ACC_OPENCL_STREAM_PRIORITIES) - LIBXSMM_UNUSED(priority); -# else - if (CL_QUEUE_PRIORITY_HIGH_KHR <= priority && CL_QUEUE_PRIORITY_LOW_KHR >= priority) { - properties[3] = priority; - } - else { - int least = -1, greatest = -1; - if (0 != (1 & c_dbcsr_acc_opencl_config.priority) && EXIT_SUCCESS == c_dbcsr_acc_stream_priority_range(&least, &greatest) && - least != greatest) - { - properties[3] = (0 != (2 & c_dbcsr_acc_opencl_config.priority) && - (NULL != LIBXSMM_STRISTR(name, "calc") || (NULL != strstr(name, "priority")))) - ? CL_QUEUE_PRIORITY_HIGH_KHR - : CL_QUEUE_PRIORITY_MED_KHR; - } - else { - properties[3] = least; - } - } - if (CL_QUEUE_PRIORITY_HIGH_KHR <= properties[3] && CL_QUEUE_PRIORITY_LOW_KHR >= properties[3]) { - priority = properties[3]; /* sanitize */ - properties[2] = CL_QUEUE_PRIORITY_KHR; - properties[4] = 0; /* terminator */ - } -# endif - ACC_OPENCL_ACQUIRE(c_dbcsr_acc_opencl_config.lock_stream); -# if defined(_OPENMP) - { - static int c_dbcsr_acc_opencl_stream_counter_base = 0; - static int c_dbcsr_acc_opencl_stream_counter = 0; - if (1 < omp_get_num_threads()) { - const int i = c_dbcsr_acc_opencl_stream_counter++; - assert(0 < c_dbcsr_acc_opencl_config.nthreads); - tid = (i < c_dbcsr_acc_opencl_config.nthreads ? i : (i % c_dbcsr_acc_opencl_config.nthreads)); - } - else offset = c_dbcsr_acc_opencl_stream_counter_base++; - } -# endif - if (NULL == devinfo->context) -# if defined(ACC_OPENCL_ACTIVATE) - { - result = EXIT_FAILURE; - } - else -# else - { - result = c_dbcsr_acc_opencl_set_active_device(NULL /*lock*/, c_dbcsr_acc_opencl_config.device_id); - } - if (NULL != devinfo->context) -# endif - { - const cl_device_id device_id = c_dbcsr_acc_opencl_config.devices[c_dbcsr_acc_opencl_config.device_id]; - if (NULL != c_dbcsr_acc_opencl_config.hist_h2d || NULL != c_dbcsr_acc_opencl_config.hist_d2h || - NULL != c_dbcsr_acc_opencl_config.hist_d2d) - { - properties[1] |= CL_QUEUE_PROFILING_ENABLE; - } -# if defined(ACC_OPENCL_XHINTS) - if ((2 & c_dbcsr_acc_opencl_config.xhints) && 0 != devinfo->intel) { - properties[1] |= (((ACC_OPENCL_STREAM_PROPERTIES_TYPE)1) << 31); /* CL_QUEUE_THREAD_LOCAL_EXEC_ENABLE_INTEL */ - } - if ((4 & c_dbcsr_acc_opencl_config.xhints) && 0 != devinfo->intel) { - struct { - cl_command_queue_properties properties; - cl_bitfield capabilities; - cl_uint count; - char name[64 /*CL_QUEUE_FAMILY_MAX_NAME_SIZE_INTEL*/]; - } intel_qfprops[16]; - const int j = (0 /*terminator*/ == properties[2] ? 2 : 4); - size_t nbytes = 0, i; - if (EXIT_SUCCESS == clGetDeviceInfo(device_id, 0x418B /*CL_DEVICE_QUEUE_FAMILY_PROPERTIES_INTEL*/, sizeof(intel_qfprops), - intel_qfprops, &nbytes)) - { /* enable queue families */ - for (i = 0; (i * sizeof(*intel_qfprops)) < nbytes; ++i) { - if (0 /*CL_QUEUE_DEFAULT_CAPABILITIES_INTEL*/ == intel_qfprops[i].capabilities && 1 < intel_qfprops[i].count) { - properties[j + 0] = 0x418C; /* CL_QUEUE_FAMILY_INTEL */ - properties[j + 1] = (int)i; - properties[j + 2] = 0x418D; /* CL_QUEUE_INDEX_INTEL */ - properties[j + 3] = (i + offset) % intel_qfprops[i].count; - properties[j + 4] = 0; /* terminator */ - break; - } - } - } - } -# endif - queue = ACC_OPENCL_CREATE_COMMAND_QUEUE(devinfo->context, device_id, properties, &result); - } - if (EXIT_SUCCESS == result) { /* register stream */ - assert(NULL != c_dbcsr_acc_opencl_config.streams && NULL != queue); - *stream_p = c_dbcsr_acc_opencl_pmalloc( - NULL /*lock*/, (void**)c_dbcsr_acc_opencl_config.streams, &c_dbcsr_acc_opencl_config.nstreams); - if (NULL != *stream_p) { - c_dbcsr_acc_opencl_stream_t* const str = (c_dbcsr_acc_opencl_stream_t*)*stream_p; -# if !defined(NDEBUG) - LIBXSMM_MEMZERO127(str); -# endif - str->queue = queue; - str->tid = tid; -# if defined(ACC_OPENCL_STREAM_PRIORITIES) - str->priority = priority; -# endif - } - else result = EXIT_FAILURE; - } - ACC_OPENCL_RELEASE(c_dbcsr_acc_opencl_config.lock_stream); - if (EXIT_SUCCESS != result && NULL != queue) { - clReleaseCommandQueue(queue); - *stream_p = NULL; - } -# if defined(ACC_OPENCL_PROFILE_DBCSR) - if (0 != c_dbcsr_acc_opencl_config.profile) c_dbcsr_timestop(&routine_handle); -# endif - ACC_OPENCL_RETURN(result, name); -} - - -int c_dbcsr_acc_stream_destroy(void* stream) { - int result = EXIT_SUCCESS; -# if defined(ACC_OPENCL_PROFILE_DBCSR) - int routine_handle; - if (0 != c_dbcsr_acc_opencl_config.profile) { - static const char* routine_name_ptr = LIBXSMM_FUNCNAME + ACC_OPENCL_PROFILE_DBCSR; - static const int routine_name_len = (int)sizeof(LIBXSMM_FUNCNAME) - (ACC_OPENCL_PROFILE_DBCSR + 1); - c_dbcsr_timeset((const char**)&routine_name_ptr, &routine_name_len, &routine_handle); - } -# endif - if (NULL != stream) { - const c_dbcsr_acc_opencl_stream_t* const str = ACC_OPENCL_STREAM(stream); - const cl_command_queue queue = str->queue; - assert(NULL != c_dbcsr_acc_opencl_config.streams); - ACC_OPENCL_ACQUIRE(c_dbcsr_acc_opencl_config.lock_stream); - c_dbcsr_acc_opencl_pfree(stream, (void**)c_dbcsr_acc_opencl_config.streams, &c_dbcsr_acc_opencl_config.nstreams); - if (NULL != queue) { - result = clReleaseCommandQueue(queue); -# if !defined(NDEBUG) - LIBXSMM_MEMZERO127((c_dbcsr_acc_opencl_stream_t*)stream); -# endif - } - ACC_OPENCL_RELEASE(c_dbcsr_acc_opencl_config.lock_stream); - } -# if defined(ACC_OPENCL_PROFILE_DBCSR) - if (0 != c_dbcsr_acc_opencl_config.profile) c_dbcsr_timestop(&routine_handle); -# endif - ACC_OPENCL_RETURN(result); -} - - -int c_dbcsr_acc_stream_priority_range(int* least, int* greatest) { - int result = ((NULL != least || NULL != greatest) ? EXIT_SUCCESS : EXIT_FAILURE); - int priohi = -1, priolo = -1; -# if defined(ACC_OPENCL_PROFILE_DBCSR) - int routine_handle; - if (0 != c_dbcsr_acc_opencl_config.profile) { - static const char* routine_name_ptr = LIBXSMM_FUNCNAME + ACC_OPENCL_PROFILE_DBCSR; - static const int routine_name_len = (int)sizeof(LIBXSMM_FUNCNAME) - (ACC_OPENCL_PROFILE_DBCSR + 1); - c_dbcsr_timeset((const char**)&routine_name_ptr, &routine_name_len, &routine_handle); - } -# endif - assert(least != greatest); /* no alias */ -# if defined(ACC_OPENCL_STREAM_PRIORITIES) - if (0 < c_dbcsr_acc_opencl_config.ndevices) { - const cl_device_id device_id = c_dbcsr_acc_opencl_config.devices[c_dbcsr_acc_opencl_config.device_id]; - const c_dbcsr_acc_opencl_device_t* const devinfo = &c_dbcsr_acc_opencl_config.device; - char buffer[ACC_OPENCL_BUFFERSIZE]; - cl_platform_id platform = NULL; - assert(NULL != devinfo->context); - ACC_OPENCL_CHECK(result, clGetDeviceInfo(device_id, CL_DEVICE_PLATFORM, sizeof(cl_platform_id), &platform, NULL), - "retrieve platform associated with active device"); - ACC_OPENCL_CHECK(result, clGetPlatformInfo(platform, CL_PLATFORM_EXTENSIONS, ACC_OPENCL_BUFFERSIZE, buffer, NULL), - "retrieve platform extensions"); - if (EXIT_SUCCESS == result) { - if (NULL != strstr(buffer, "cl_khr_priority_hints") || - EXIT_SUCCESS == c_dbcsr_acc_opencl_device_vendor(device_id, "nvidia", 0 /*use_platform_name*/)) - { - priohi = CL_QUEUE_PRIORITY_HIGH_KHR; - priolo = CL_QUEUE_PRIORITY_LOW_KHR; - } - } - } -# endif - if (NULL != greatest) *greatest = priohi; - if (NULL != least) *least = priolo; -# if defined(ACC_OPENCL_PROFILE_DBCSR) - if (0 != c_dbcsr_acc_opencl_config.profile) c_dbcsr_timestop(&routine_handle); -# endif - ACC_OPENCL_RETURN(result); -} - - -int c_dbcsr_acc_stream_sync(void* stream) { - const c_dbcsr_acc_opencl_stream_t* str = NULL; - int result = EXIT_SUCCESS; -# if defined(ACC_OPENCL_PROFILE_DBCSR) - int routine_handle; - if (0 != c_dbcsr_acc_opencl_config.profile) { - static const char* routine_name_ptr = LIBXSMM_FUNCNAME + ACC_OPENCL_PROFILE_DBCSR; - static const int routine_name_len = (int)sizeof(LIBXSMM_FUNCNAME) - (ACC_OPENCL_PROFILE_DBCSR + 1); - c_dbcsr_timeset((const char**)&routine_name_ptr, &routine_name_len, &routine_handle); - } -# endif - str = (NULL != stream ? ACC_OPENCL_STREAM(stream) : c_dbcsr_acc_opencl_stream_default()); - assert(NULL != str && NULL != str->queue); - if (0 == (16 & c_dbcsr_acc_opencl_config.wa)) result = clFinish(str->queue); - else { - cl_event event = NULL; -# if defined(CL_VERSION_1_2) - result = clEnqueueMarkerWithWaitList(str->queue, 0, NULL, &event); -# else - result = clEnqueueMarker(str->queue, &event); -# endif - if (EXIT_SUCCESS == result) { - assert(NULL != event); - result = clWaitForEvents(1, &event); - } - if (NULL != event) ACC_OPENCL_EXPECT(EXIT_SUCCESS == clReleaseEvent(event)); - } -# if defined(ACC_OPENCL_PROFILE_DBCSR) - if (0 != c_dbcsr_acc_opencl_config.profile) c_dbcsr_timestop(&routine_handle); -# endif - ACC_OPENCL_RETURN(result); -} - - -int c_dbcsr_acc_opencl_device_synchronize(ACC_OPENCL_LOCKTYPE* lock, int thread_id) { - int result = EXIT_SUCCESS; - const size_t n = ACC_OPENCL_MAXNITEMS * c_dbcsr_acc_opencl_config.nthreads; - size_t i; - assert(thread_id < c_dbcsr_acc_opencl_config.nthreads); - assert(NULL != c_dbcsr_acc_opencl_config.streams); - if (NULL != lock) ACC_OPENCL_ACQUIRE(lock); - for (i = c_dbcsr_acc_opencl_config.nstreams; i < n; ++i) { - const c_dbcsr_acc_opencl_stream_t* const str = c_dbcsr_acc_opencl_config.streams[i]; - if (NULL != str && NULL != str->queue) { - if (0 > thread_id || str->tid == thread_id) { /* hit */ - result = clFinish(str->queue); - if (EXIT_SUCCESS != result) break; - } - } - else { /* error */ - result = EXIT_FAILURE; - break; - } - } - if (NULL != lock) ACC_OPENCL_RELEASE(lock); - return result; -} - - -int c_dbcsr_acc_device_synchronize(void) { - int result = EXIT_SUCCESS; -# if defined(ACC_OPENCL_PROFILE_DBCSR) - int routine_handle; - if (0 != c_dbcsr_acc_opencl_config.profile) { - const char** routine_name_ptr; - const int* routine_name_len; -# if defined(_OPENMP) - if (1 == omp_get_num_threads()) { - static const char* routine_name_ptr_all = "c_dbcsr_acc_device_synchronize_all" + ACC_OPENCL_PROFILE_DBCSR; - static const int routine_name_len_all = (int)sizeof("c_dbcsr_acc_device_synchronize_all") - (ACC_OPENCL_PROFILE_DBCSR + 1); - routine_name_ptr = (const char**)&routine_name_ptr_all; - routine_name_len = &routine_name_len_all; - } - else -# endif - { - static const char* routine_name_ptr_any = LIBXSMM_FUNCNAME + ACC_OPENCL_PROFILE_DBCSR; - static const int routine_name_len_any = (int)sizeof(LIBXSMM_FUNCNAME) - (ACC_OPENCL_PROFILE_DBCSR + 1); - routine_name_ptr = (const char**)&routine_name_ptr_any; - routine_name_len = &routine_name_len_any; - } - c_dbcsr_timeset(routine_name_ptr, routine_name_len, &routine_handle); - } -# endif -# if defined(_OPENMP) - if (1 == omp_get_num_threads()) { - result = c_dbcsr_acc_opencl_device_synchronize(c_dbcsr_acc_opencl_config.lock_stream, -1 /*all*/); - } - else { - result = c_dbcsr_acc_opencl_device_synchronize(NULL /*lock*/, omp_get_thread_num()); - } -# else - result = c_dbcsr_acc_opencl_device_synchronize(NULL /*lock*/, /*main*/ 0); -# endif -# if defined(ACC_OPENCL_PROFILE_DBCSR) - if (0 != c_dbcsr_acc_opencl_config.profile) c_dbcsr_timestop(&routine_handle); -# endif - ACC_OPENCL_RETURN(result); -} - -# if defined(__cplusplus) -} -# endif - -#endif /*__OPENCL*/ diff --git a/src/acc/opencl/common/opencl_atomics.h b/src/acc/opencl/common/opencl_atomics.h deleted file mode 100644 index ac2a799f792..00000000000 --- a/src/acc/opencl/common/opencl_atomics.h +++ /dev/null @@ -1,148 +0,0 @@ -/*------------------------------------------------------------------------------------------------*/ -/* Copyright (C) by the DBCSR developers group - All rights reserved */ -/* This file is part of the DBCSR library. */ -/* */ -/* For information on the license, see the LICENSE file. */ -/* For further information please visit https://dbcsr.cp2k.org */ -/* SPDX-License-Identifier: BSD-3-Clause */ -/*------------------------------------------------------------------------------------------------*/ -#ifndef OPENCL_ATOMICS_H -#define OPENCL_ATOMICS_H - -#include "opencl_common.h" - -#if (2 == TAN /*c_dbcsr_acc_opencl_atomic_fp_64*/) -# if !defined(T) -# define T double -# endif -# define ZERO 0.0 -#elif (1 == TAN /*c_dbcsr_acc_opencl_atomic_fp_32*/) -# if !defined(T) -# define T float -# endif -# define ZERO 0.f -#elif defined(T) /*c_dbcsr_acc_opencl_atomic_fp_no*/ -# define ZERO 0 -#endif - -#define GLOBAL_VOLATILE(A) global volatile A - -#if defined(ATOMIC_PROTOTYPES) || defined(__opencl_c_ext_fp64_global_atomic_add) -# if defined(__opencl_c_ext_fp64_global_atomic_add) -# undef ATOMIC_ADD_GLOBAL -# if defined(TF) -# define ATOMIC_ADD_GLOBAL(A, B) \ - atomic_fetch_add_explicit((GLOBAL_VOLATILE(TF)*)A, B, memory_order_relaxed, memory_scope_work_group) -# else -# define ATOMIC_ADD_GLOBAL(A, B) atomic_add(A, B) -# endif -# elif (2 < ATOMIC_PROTOTYPES) && defined(TF) -# undef ATOMIC_ADD_GLOBAL -# define ATOMIC_ADD_GLOBAL(A, B) \ - __opencl_atomic_fetch_add((GLOBAL_VOLATILE(TF)*)A, B, memory_order_relaxed, memory_scope_work_group) -# else -# if defined(TF) && (!defined(ATOMIC_PROTOTYPES) || 1 < ATOMIC_PROTOTYPES) -__attribute__((overloadable)) T atomic_fetch_add_explicit(GLOBAL_VOLATILE(TF) *, T, memory_order, memory_scope); -# else -__attribute__((overloadable)) T atomic_add(GLOBAL_VOLATILE(T) *, T); -# endif -# endif -#endif - -#define ACCUMULATE(A, B) ATOMIC_ADD_GLOBAL(A, B) - - -#if !defined(cl_intel_global_float_atomics) || (2 == TAN /*c_dbcsr_acc_opencl_atomic_fp_64*/) -# if defined(ATOMIC32_ADD64) -__attribute__((always_inline)) inline void atomic32_add64_global(GLOBAL_VOLATILE(double) * dst, double inc) { - *dst += inc; /* TODO */ -} -# endif -#endif - - -#if !defined(cl_intel_global_float_atomics) || (2 == TAN /*c_dbcsr_acc_opencl_atomic_fp_64*/) -# if defined(CMPXCHG) -__attribute__((always_inline)) inline void atomic_add_global_cmpxchg(GLOBAL_VOLATILE(T) * dst, T inc) { -# if !defined(ATOMIC32_ADD64) - union { - T f; - TA a; - } exp_val, try_val, cur_val = {.f = *dst}; - do { - exp_val.a = cur_val.a; - try_val.f = exp_val.f + inc; -# if defined(TA2) - if (0 == atomic_compare_exchange_weak_explicit((GLOBAL_VOLATILE(TA2)*)dst, &cur_val.a, try_val.a, memory_order_relaxed, - memory_order_relaxed, memory_scope_work_group)) - continue; -# else - cur_val.a = CMPXCHG((GLOBAL_VOLATILE(TA)*)dst, exp_val.a, try_val.a); -# endif - } while (cur_val.a != exp_val.a); -# else - atomic32_add64_global(dst, inc); -# endif -} -# endif -#endif - - -#if !defined(cl_intel_global_float_atomics) || (2 == TAN /*c_dbcsr_acc_opencl_atomic_fp_64*/) -# if defined(ATOMIC_ADD2_GLOBAL) && (1 == TAN /*c_dbcsr_acc_opencl_atomic_fp_32*/) -__attribute__((always_inline)) inline void atomic_add_global_cmpxchg2(GLOBAL_VOLATILE(float) * dst, float2 inc) { - union { - float2 f; - long a; - } exp_val, try_val, cur_val = {.f = (float2)(dst[0], dst[1])}; - do { - exp_val.a = cur_val.a; - try_val.f = exp_val.f + inc; -# if defined(TA2) - if (0 == atomic_compare_exchange_weak_explicit((GLOBAL_VOLATILE(atomic_long)*)dst, &cur_val.a, try_val.a, memory_order_relaxed, - memory_order_relaxed, memory_scope_work_group)) - continue; -# else - cur_val.a = atom_cmpxchg((GLOBAL_VOLATILE(long)*)dst, exp_val.a, try_val.a); -# endif - } while (cur_val.a != exp_val.a); -} -# endif -#endif - - -#if !defined(cl_intel_global_float_atomics) || (2 == TAN /*c_dbcsr_acc_opencl_atomic_fp_64*/) -# if defined(XCHG) || (defined(__NV_CL_C_VERSION) && !defined(CMPXCHG) && !defined(ATOMIC_PROTOTYPES)) -__attribute__((always_inline)) inline void atomic_add_global_xchg(GLOBAL_VOLATILE(T) * dst, T inc) { -# if !defined(ATOMIC32_ADD64) -# if (defined(__NV_CL_C_VERSION) && !defined(XCHG)) && (1 == TAN /*c_dbcsr_acc_opencl_atomic_fp_32*/) - asm("{ .reg .f32 t; atom.global.add.f32 t, [%0], %1; }" ::"l"(dst), "f"(inc)); -# elif (defined(__NV_CL_C_VERSION) && !defined(XCHG)) && (2 == TAN /*c_dbcsr_acc_opencl_atomic_fp_64*/) - asm("{ .reg .f64 t; atom.global.add.f64 t, [%0], %1; }" ::"l"(dst), "d"(inc)); -# else - union { - T f; - TA a; - } exp_val = {.f = inc}, try_val, cur_val = {/*.f = ZERO*/ .a = 0}; - do { -# if defined(TA2) - try_val.a = atomic_exchange_explicit((GLOBAL_VOLATILE(TA2)*)dst, cur_val.a, memory_order_relaxed, memory_scope_work_group); -# else - try_val.a = XCHG((GLOBAL_VOLATILE(TA)*)dst, cur_val.a); -# endif - try_val.f += exp_val.f; -# if defined(TA2) - exp_val.a = atomic_exchange_explicit((GLOBAL_VOLATILE(TA2)*)dst, try_val.a, memory_order_relaxed, memory_scope_work_group); -# else - exp_val.a = XCHG((GLOBAL_VOLATILE(TA)*)dst, try_val.a); -# endif - } while (cur_val.a != exp_val.a); -# endif -# else - atomic32_add64_global(dst, inc); -# endif -} -# endif -#endif - -#endif /*OPENCL_ATOMICS_H*/ diff --git a/src/acc/opencl/common/opencl_common.h b/src/acc/opencl/common/opencl_common.h deleted file mode 100644 index d32e720b1ec..00000000000 --- a/src/acc/opencl/common/opencl_common.h +++ /dev/null @@ -1,66 +0,0 @@ -/*------------------------------------------------------------------------------------------------*/ -/* Copyright (C) by the DBCSR developers group - All rights reserved */ -/* This file is part of the DBCSR library. */ -/* */ -/* For information on the license, see the LICENSE file. */ -/* For further information please visit https://dbcsr.cp2k.org */ -/* SPDX-License-Identifier: BSD-3-Clause */ -/*------------------------------------------------------------------------------------------------*/ -#ifndef OPENCL_COMMON_H -#define OPENCL_COMMON_H - -#if !defined(ACC_OPENCL_C_VERSION) -# define ACC_OPENCL_C_VERSION __OPENCL_C_VERSION__ -#endif -#if !defined(ACC_OPENCL_VERSION) -# define ACC_OPENCL_VERSION __OPENCL_VERSION__ -#endif - -#if (200 /*CL_VERSION_2_0*/ <= ACC_OPENCL_C_VERSION) || defined(__NV_CL_C_VERSION) -# define UNROLL_FORCE(N) __attribute__((opencl_unroll_hint(N))) -# define UNROLL_AUTO __attribute__((opencl_unroll_hint)) -#else -# define UNROLL_FORCE(N) -# define UNROLL_AUTO -#endif - -#if !defined(LU) || (-1 == LU) -# define UNROLL_OUTER(N) -# define UNROLL(N) -#else /* (-2) full, (-1) no hints, (0) inner, (1) outer-dehint, (2) block-m */ -# if (1 <= LU) /* outer-dehint */ -# define UNROLL_OUTER(N) UNROLL_FORCE(1) -# elif (-1 > LU) /* full */ -# define UNROLL_OUTER(N) UNROLL_FORCE(N) -# else /* inner */ -# define UNROLL_OUTER(N) -# endif -# define UNROLL(N) UNROLL_FORCE(N) -#endif - -#define BCST_NO(V, I) (V) -#if defined(WG) && (0 < WG) && defined(GPU) && (200 <= ACC_OPENCL_VERSION) -# define BCST_WG(V, I) work_group_broadcast(V, I) -#endif -#if defined(SG) && (0 < SG) && defined(GPU) && (200 <= ACC_OPENCL_VERSION) -# define BCST_SG(V, I) sub_group_broadcast(V, I) -#endif - -#if !defined(MIN) -# define MIN(A, B) ((A) < (B) ? (A) : (B)) -#endif -#if !defined(MAX) -# define MAX(A, B) ((A) < (B) ? (B) : (A)) -#endif -#if !defined(MAD) -# define MAD fma -#endif - -#define DIVUP(A, B) (((A) + (B) - 1) / (B)) -#define NUP(N, UP) (DIVUP(N, UP) * (UP)) -#define BLR(N, BN) (NUP(N, BN) - (N)) - -#define IDX(I, J, M, N) ((int)(I) * (N) + (J)) -#define IDT(I, J, M, N) IDX(J, I, N, M) - -#endif /*OPENCL_COMMON_H*/ diff --git a/src/acc/opencl/smm/.gitignore b/src/acc/opencl/smm/.gitignore deleted file mode 100644 index 9cb97ee5dac..00000000000 --- a/src/acc/opencl/smm/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -opencl_kernels.h -.with_gpu diff --git a/src/acc/opencl/smm/CMakeLists.txt b/src/acc/opencl/smm/CMakeLists.txt deleted file mode 100644 index 53e65f9c22b..00000000000 --- a/src/acc/opencl/smm/CMakeLists.txt +++ /dev/null @@ -1,42 +0,0 @@ -set(DBCSR_OPENCL_PARAMS_WITHGPU - ${CMAKE_CURRENT_SOURCE_DIR}/params/tune_multiply_${WITH_GPU}.csv) -set(DBCSR_OPENCL_PARAMS_CUSTOM ${CMAKE_CURRENT_SOURCE_DIR}/tune_multiply.csv) - -if (EXISTS ${DBCSR_OPENCL_PARAMS_WITHGPU}) - set(DBCSR_OPENCL_SCRIPT_MSG - "ACC/LIBSMM OpenCL: using parameters for ${WITH_GPU}") - set(DBCSR_OPENCL_PARAMS ${DBCSR_OPENCL_PARAMS_WITHGPU}) -elseif (WITH_GPU MATCHES "none") - set(DBCSR_OPENCL_SCRIPT_MSG "ACC/LIBSMM OpenCL: no tuned parameters used") - set(DBCSR_OPENCL_SCRIPT_ARGS -p \"\") -elseif (EXISTS ${DBCSR_OPENCL_PARAMS_CUSTOM}) - set(DBCSR_OPENCL_SCRIPT_MSG "ACC/LIBSMM OpenCL: using custom parameters") - set(DBCSR_OPENCL_PARAMS ${DBCSR_OPENCL_PARAMS_CUSTOM}) -else () - set(DBCSR_OPENCL_SCRIPT_MSG "ACC/LIBSMM OpenCL: using all tuned parameters") -endif () -message(STATUS ${DBCSR_OPENCL_SCRIPT_MSG}) - -set(DBCSR_OPENCL_KERNELS kernels/multiply.cl kernels/transpose.cl) -list(TRANSFORM DBCSR_OPENCL_KERNELS PREPEND ${CMAKE_CURRENT_SOURCE_DIR}/) - -list(APPEND DBCSR_OPENCL_DEPENDS ${DBCSR_ACC_HEADER} ${DBCSR_OPENCL_COMMON}) -list(TRANSFORM DBCSR_OPENCL_DEPENDS PREPEND ${DBCSR_SOURCE_DIR}/) - -set(DBCSR_OPENCL_KHEADER opencl_kernels.h) - -add_custom_command( - COMMAND - ${DBCSR_OPENCL_SCRIPT} ${DBCSR_OPENCL_SCRIPT_ARGS} ${DBCSR_OPENCL_KERNELS} - ${DBCSR_OPENCL_PARAMS} ${CMAKE_CURRENT_SOURCE_DIR}/${DBCSR_OPENCL_KHEADER} - DEPENDS ${DBCSR_OPENCL_DEPENDS} ${DBCSR_OPENCL_KERNELS} ${DBCSR_OPENCL_SCRIPT} - ${DBCSR_OPENCL_PARAMS} - OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/${DBCSR_OPENCL_KHEADER} - COMMENT ${DBCSR_OPENCL_SCRIPT_MSG}) - -add_custom_target(${DBCSR_OPENCL_KHEADER} - DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${DBCSR_OPENCL_KHEADER}) -add_dependencies(dbcsr ${DBCSR_OPENCL_KHEADER}) - -target_include_directories(dbcsr PRIVATE ${CMAKE_CURRENT_BINARY_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}) diff --git a/src/acc/opencl/smm/PACKAGE b/src/acc/opencl/smm/PACKAGE deleted file mode 100644 index cbd0135e530..00000000000 --- a/src/acc/opencl/smm/PACKAGE +++ /dev/null @@ -1,5 +0,0 @@ -{ -"description": "OpenCL-accelerated library for small matrix multiplications", -"archive": "libdbcsr", -"requires": ["..", "../.."] -} diff --git a/src/acc/opencl/smm/README-autotune.md b/src/acc/opencl/smm/README-autotune.md deleted file mode 100644 index 87254a410bb..00000000000 --- a/src/acc/opencl/smm/README-autotune.md +++ /dev/null @@ -1,52 +0,0 @@ -# Auto Tuning - -Auto tuning code for performance is a practical way to find the "best" setting for parameterized code (e.g., GPU kernels). Introducing effective parameters is a prerequisite, and exploring the (potentially) high-dimensional parameter space in an efficient way is an art. It is desirable to have reasonable defaults even without auto-tuning the parameters. It would be even better to avoid auto-tuning if best performance was possible right away. - -For the OpenCL based LIBSMM, a variety of parameters are explored using [OpenTuner](http://opentuner.org/). The script [tune_multiply.py](https://github.com/cp2k/dbcsr/blob/develop/src/acc/opencl/smm/tune_multiply.py) (or tune_multiply.sh) leverages the `acc_bench` by parsing console output (timing, data type, etc.). This way, the tuning is implemented without being intermingled with the subject being tuned. The "communication" between the tuner and the executable is solely based on environment variables. - -**NOTE**: If `tune_multiply.py` (or `tune_multiply.sh`) is called with an environment variable already set, the respective parameter (e.g., `OPENCL_LIBSMM_SMM_BM` or `OPENCL_LIBSMM_SMM_BN`) is considered fixed (and not tuned automatically). This way, the parameter space is reduced in size and effort can be directed more intensely towards the remaining parameters. - -To toggle the benchmarks between tuning single precision (SP) and double precision (DP), `make ELEM_TYPE=float` can be used when building the benchmark driver (`ELEM_TYPE` can be also directly edited in [acc_bench.c](https://github.com/cp2k/dbcsr/blob/develop/src/acc/acc_bench.c)). Auto-tuned parameters for SP and DP can be embedded into the same final application and are considered correctly at runtime. - -To build the benchmarks in double precision (`ELEM_TYPE=double` is default): - -```bash -cd src/acc/opencl -make -``` - -To build the benchmarks in single precision (SP): - -```bash -cd src/acc/opencl -make ELEM_TYPE=float -``` - -To auto-tune, please install the Python `wheel` and `opentuner` packages: - -```bash -cd src/acc/opencl/smm -pip install -r requirements.txt -``` - -The OpenTuner script supports several command line arguments (`tune_multiply.py --help`). For example, `--stop-after=300` can be of interest to finish in five minutes (without limit, OpenTuner decides when the auto-tuning process is finished). A single kernel can be selected by M, N, and K parameters (GEMM), e.g., `M=15`, `N=5`, and `K=7`: - -```bash -./tune_multiply.py 13x5x7 -``` - -**NOTE**: If multiple different kernels are tuned using `tune_multiply.py`, it is advisable to delete the `opentuner.db` directory prior to tuning a different kernel since otherwise auto-tuning is potentially (mis-)guided by information which was collected for a different kernel (`tune_multiply.sh` does this automatically). - -The OpenTuner script implements multiple objectives ("cost"), primarily "accuracy" (maximized) and a secondary objective "size" (minimized). The former represents the achieved performance (GFLOPS/s) while the latter represents an artificial kernel requirement (just to prefer one parameter set over another in case of similar performance). The console output looks like ("accuracy" denotes performance in GFLOPS/s): - -```text -[ 15s] INFO opentuner.search.plugin.DisplayPlugin: tests=8, best {'BS': 32, 'BM': 6, 'BN': 1}, cost accuracy=28.80000000, size=1.0, found by UniformGreedyMutation -[ 27s] INFO opentuner.search.plugin.DisplayPlugin: tests=19, best {'BS': 48, 'BM': 8, 'BN': 1}, cost accuracy=32.20000000, size=1.0, found by UniformGreedyMutation -[ 40s] INFO opentuner.search.plugin.DisplayPlugin: tests=31, best {'BS': 48, 'BM': 8, 'BN': 1}, cost accuracy=32.20000000, size=1.0, found by UniformGreedyMutation -[ 54s] INFO opentuner.search.plugin.DisplayPlugin: tests=43, best {'BS': 48, 'BM': 8, 'BN': 1}, cost accuracy=32.20000000, size=1.0, found by UniformGreedyMutation -[ 67s] INFO opentuner.search.plugin.DisplayPlugin: tests=53, best {'BS': 48, 'BM': 8, 'BN': 1}, cost accuracy=32.20000000, size=1.0, found by UniformGreedyMutation -``` - -The script finally writes a JSON-file with a filename like `tune_multiply-float-12x12x12-s15-60gflops.json` which is encoding the benchmark ("multiply"), the precision ("float"), the kernel ("12x12x12"), the number of bits necessary to represent the size of the problem, i.e., log2 of the problem-size ("s15"), and the achieved performance ("60gflops"). The script handles SIGINT (like Ctrl-C), and output is still written despite of abnormally terminating (can be abused to tune interactively). Tuning starts from an internal default that is supposed to match LIBSMM's internal default parameters. However, tuning can be (re-)started with specific parameters (e.g., `-bs 64`, `-bm 13`, `-bn 1` for `OPENCL_LIBSMM_SMM_BS`, `OPENCL_LIBSMM_SMM_BM`, and `OPENCL_LIBSMM_SMM_BN` respectively), or partially fixed for a subset of parameters. - -**NOTE**: The `acc_bench` executable is potentially started many times when auto-tuning parameters, therefore it is advisable to keep the state of the GPU driver stack persistent (if the setup would otherwise unload the driver configuration), e.g., `nvidia-smi -pm ENABLED`. This can happen in cases where the GPU is only for compute and not used for graphics (no X-Window system, e.g., in case of a "headless" system). Time needed for tuning parameters is not only impacted by accessing and readying the device, but also by the time needed to compile a kernel at runtime aka Just-In-Time (JIT). diff --git a/src/acc/opencl/smm/README-bulktune.md b/src/acc/opencl/smm/README-bulktune.md deleted file mode 100644 index 0b1e20a2ed3..00000000000 --- a/src/acc/opencl/smm/README-bulktune.md +++ /dev/null @@ -1,89 +0,0 @@ -# Optimized Kernels - -Optimized kernel parameters are stored in JSON-files and are automatically summarized into a CSV-file. Further and beyond auto-tuning kernels, [tune_multiply.py](https://github.com/cp2k/dbcsr/blob/develop/src/acc/opencl/smm/tune_multiply.py) can be used to perform basic operations on collected data: explicitly merging all JSON-files into a CSV-file (`tune_multiply.py -m`), and updating the device name in all JSON-files according to current driver version (`tune_multiply.py -u`). - -Collected or auto-tuned parameters achieved with single precision (SP), double precision (DP), or from different devices can be safely combined. Practically, `acc_opencl.sh` transforms the CSV-file into source code compiled into the final binary, which is independent of `OPENCL_LIBSMM_SMM_PARAMS` accepting a CSV-file (path/filename). However, `acc_opencl.sh` currently limits the origin of parameters to a single device. Care must still be taken to not summarize unrelated results, e.g., after (major) source code changes. The CSV-file is automatically incorporated into LIBSMM by the next clean (re-)build. The format of the CSV-file is assumed to contain column names in the first row (header). - -Different problem sizes (like "s15"; see above) are not represented individually, but are instead collected into a maximum value. In turn, this means tuning for a non-default problem-size must be manually kept pure since the result achieved with a larger problem may dominate (maximum value). - -```bash -cd src/acc/opencl -make realclean -make -``` - -This way auto-tuned kernels just work and can be of course exercised using the afore mentioned benchmark: - -```bash -cd src/acc -./acc_bench 5 30000 13 5 7 -``` - -Tuned parameters can be also disabled at runtime like: - -```bash -cd src/acc -OPENCL_LIBSMM_SMM_PARAMS=0 ./acc_bench 5 30000 13 5 7 -``` - -By supplying a CSV-file at runtime, embedded parameters and defaults are overriden, and given parameters are applied even if the current device is different from what would match the given parameters: - -```bash -cd src/acc -OPENCL_LIBSMM_SMM_PARAMS=opencl/smm/tune_multiply.csv ./acc_bench 5 30000 13 5 7 -``` - -To tune multiple kernels in a convenient fashion, a triplet specification can be supplied to the [tune_multiply.sh](https://github.com/cp2k/dbcsr/blob/develop/src/acc/opencl/smm/tune_multiply.sh) wrapper script. This script estimates the total runtime for auto-tuning kernels, cleans up intermediate results (`opentuner.db`), allows to specify triplets, and splits work to auto-tune in parallel. - -Triplets are used to conveniently describe multiple kernels. A triplet specification consists of comma-separated groups of (M,N,K)-extents, i.e., matrix shapes according to GEMM. For example: - -```text -4 10 15, 6 7 8, 23 -``` - -This triplet specification expands to 55 kernels using the Cartesian product within each group and concatenating the result of such expanded groups followed by removing duplicate triplets. Further, the wrapper script allows to limit the time spent for tuning a single kernel and to partition the number of kernels to be tuned, e.g., among a cluster of eight systems (below the first partition out of eight would be processed with five minutes per kernel and about 35 minutes in total per partition). - -```bash -cd src/acc/opencl/smm -./tune_multiply.sh -t 300 -j 8 -i 1 4 10 15, 6 7 8, 23 -``` - -The script `tune_multiply.sh` is tuning 1266 kernels by default (`./tune_multiply.sh -t 300 -j 8 -i 1` takes approximately 13 hours per part). If the process is interrupted earlier (per SIGINT or Ctrl-C), the execution terminates for all requested kernels (triplet specification) unless `--continue` is given (or `-c`, or an environment variable `CONTINUE=1`). - -For convenience, it is possible to "update" an existing set of JSON-files (path can be given with `-p`), i.e., to parse the (M,N,K)-triplet denoted by the JSON filename and to re-tune with an almost unconstrained tuning-level (`-a 1` by default) as well as a limited duration (160 seconds per kernel by default). - -```bash -cd src/acc/opencl -make realclean -echo "Rebuild and embed smm/params/tune_multiply_P100.csv" -make WITH_GPU=P100 - -echo "Retune original parameters" -smm/tune_multiply.sh -p smm/params/p100 -u - -echo "Override original parameters" -cp tune_multiply.csv smm/params/tune_multiply_P100.csv -``` - -Tuning kernels further is only sensible if the previously tuned parameters are embedded into the binary (such that the process does not start from scratch). Retuned parameters are captured with JSON-files as usual. - -# Advanced Tuning - -To utilize multiple devices per system and to accelerate tuning kernels, `tune_multiply.py` comes with built-in support for running under MPI (SPMD execution model). The basic assumption is to spawn one process per device usually with different kernels tuned per device (SPMD). Of course, tuning the same kernels in parallel on multiple devices is possible but it is a waste of resources. Tuning on multiple devices per system can be also more realistic given the common power budget of all devices and less room for an increased operating frequency per device (Turbo clock speed). - -For example, a single dual-socket system with two PVC cards (modules) per socket exposes eight GPU devices (two GPU stacks or tiles per card). Then 350 kernels can be tuned in less than 2 1/2 hours with a duration of 200 seconds for tuning each kernel. - -```bash -MAXTIME=200 NPARTS=8 UPDATE=1 JSONDIR=params/pvc mpirun \ - ./tune_multiply.sh -i 1 : \ - ./tune_multiply.sh -i 2 : \ - ./tune_multiply.sh -i 3 : \ - ./tune_multiply.sh -i 4 : \ - ./tune_multiply.sh -i 5 : \ - ./tune_multiply.sh -i 6 : \ - ./tune_multiply.sh -i 7 : \ - ./tune_multiply.sh -i 8 \ ->out.log 2>&1 -``` - -**NOTE**: The above shown example prefers environment variables over command-line options that would be common to the eight launches of `tune_multiply.sh`. diff --git a/src/acc/opencl/smm/README.md b/src/acc/opencl/smm/README.md deleted file mode 100644 index a34c0700942..00000000000 --- a/src/acc/opencl/smm/README.md +++ /dev/null @@ -1,31 +0,0 @@ -# LIBSMM - -The LIBSMM library implements the [ACC LIBSMM interface](https://github.com/cp2k/dbcsr/blob/develop/src/acc/acc_libsmm.h), and depends on the [OpenCL backend](https://github.com/cp2k/dbcsr/blob/develop/src/acc/opencl/README.md). - -Compile-time settings are (implicitly) documented and can be adjusted by editing [opencl_libsmm.h](https://github.com/cp2k/dbcsr/blob/develop/src/acc/opencl/smm/opencl_libsmm.h), e.g., `OPENCL_LIBSMM_VALIDATE` is disabled by default but can be enabled for debug purpose. The `OPENCL_LIBSMM_VALIDATE` compile-time setting enables side-by-side validation of matrix transpose and multiply operations between device and host. For example, running DBCSR's unit tests with `OPENCL_LIBSMM_VALIDATE` enabled produces console output that allows to pin-point a kernel which misses validation. Runtime settings are made by the means of environment variables. The OpenCL backend provides `acc_getenv.sh` to list all occurrences of `getenv` categorized into "OpenCL Backend environment variables" and "OpenCL LIBSMM environment variables". - -There are two categories for the two domains in LIBSMM, i.e., matrix transpose (`OPENCL_LIBSMM_TRANS_*`) and matrix multiplication (`OPENCL_LIBSMM_SMM_*`). For transposing matrices, the settings are: - -* `OPENCL_LIBSMM_TRANS_BUILDOPTS`: character string with build options (compile and link) supplied to the OpenCL runtime compiler. -* `OPENCL_LIBSMM_TRANS_INPLACE`: Boolean value (zero or non-zero integer) for in-place matrix transpose (no local memory needed). -* `OPENCL_LIBSMM_TRANS_BM`: non-negative integer number (less/equal than the M-extent) denoting the blocksize in M-direction. - -The most common settings for multiplying matrices are: - -* `OPENCL_LIBSMM_SMM_BUILDOPTS`: character string with build options (compile and link) supplied to the OpenCL runtime compiler. -* `OPENCL_LIBSMM_SMM_PARAMS`: Disable embedded/auto-tuned parameters (`0`), or load CSV-file (e.g., `path/to/tune_multiply.csv`). -* `OPENCL_LIBSMM_SMM_BS`: non-negative integer number denoting the intra-kernel (mini-)batchsize mainly used to amortize atomic updates of data in global/main memory. The remainder with respect to the "stacksize" is handled by the kernel. -* `OPENCL_LIBSMM_SMM_BM`: non-negative integer number (less/equal than the M-extent) denoting the blocksize in M-direction. -* `OPENCL_LIBSMM_SMM_BN`: non-negative integer number (less/equal than the N-extent) denoting the blocksize in N-direction. -* `OPENCL_LIBSMM_SMM_AP`: specifies access to array of parameters (batch or "stack"). -* `OPENCL_LIBSMM_SMM_AA`: specifies access to array of A-matrices. -* `OPENCL_LIBSMM_SMM_AB`: specifies access to array of B-matrices. -* `OPENCL_LIBSMM_SMM_AC`: specifies access to array of C-matrices. - -The full list of tunable parameters and some explanation can be received with `smm/tune_multiply.py --help`, i.e., short description, default settings, and accepted values. - -**NOTE**: LIBSMM's tunable runtime settings can be non-smooth like producing distinct code-paths, e.g., `OPENCL_LIBSMM_SMM_BS=1` vs. `OPENCL_LIBSMM_SMM_BS=2`. - -# Auto Tuning - -To tune and optimize a kernel and generating kernel parameters, please refer to the [Auto Tuning](https://cp2k.github.io/dbcsr/develop/page/3-developer-guide/3-programming/2-accelerator-backend/3-libsmm_ocl/1-autotune.html) guide. To update or retune an entire set of kernels (optimized parameters), please refer to the [Bulk Tuning](https://cp2k.github.io/dbcsr/develop/page/3-developer-guide/3-programming/2-accelerator-backend/3-libsmm_ocl/2-bulktune.html) guide. diff --git a/src/acc/opencl/smm/kernels/multiply.cl b/src/acc/opencl/smm/kernels/multiply.cl deleted file mode 100644 index b338e24d520..00000000000 --- a/src/acc/opencl/smm/kernels/multiply.cl +++ /dev/null @@ -1,652 +0,0 @@ -/*------------------------------------------------------------------------------------------------*/ -/* Copyright (C) by the DBCSR developers group - All rights reserved */ -/* This file is part of the DBCSR library. */ -/* */ -/* For information on the license, see the LICENSE file. */ -/* For further information please visit https://dbcsr.cp2k.org */ -/* SPDX-License-Identifier: BSD-3-Clause */ -/*------------------------------------------------------------------------------------------------*/ -#include "../../common/opencl_atomics.h" - -#if !defined(AL) || (SM != SN) || (SM != BM) || (SN != SK) || (1 == BS) -# define ADX(M, K) adata[IDT(M, K, SM, SK) + a0] /* transposed */ -# define BDX(K, N) bdata[IDX(K, N, SK, SN) + b0] /* linear */ -# define CDX(M, N) cdata[IDT(M, N, SM, SN) + c0] /* transposed */ -#else -# define ADX(M, K) adata[IDX(M, K, SM, SK) + a0] /* linear */ -# define BDX(K, N) bdata[IDT(K, N, SK, SN) + b0] /* transposed */ -# define CDX(M, N) cdata[IDX(M, N, SM, SN) + c0] /* linear */ -#endif - -#if defined(SLM_A) -# if (1 != BK || BM < SM || 1 != BN) -# define AMK(M, K) amk[M][K] -# else -# define AMK(M, K) amk[M] -# endif -#elif defined(REG_A) -# if (1 != BK) -# define AMK(M, K) amk[K] -# else -# define AMK(M, K) amk[M] -# endif -#else -# define AMK(M, K) ADX(M, K) -#endif -#if defined(SLM_B) -# define BNK(N, K) bnk[N][K] -#elif defined(REG_B) -# if (BM < SM && 1 != BN) -# define BNK(N, K) bnk[N][K] -# else -# define BNK(N, K) bnk[K] -# endif -#else -# define BNK(N, K) BDX(K, N) -#endif -#if (1 < BS) && (defined(SLM_C) || (BM < SM && 1 != BN)) -# define CNM(N, M) cnm[N][M] -#else -# define CNM(N, M) cnm[M] -#endif - -#if !defined(SINT) /* covers matrix shape */ -# define SINT signed char -#endif -#if !defined(REPEAT) -# define REPEAT 1 -#endif - -#define NBM DIVUP(SM, BM) -#define NBN DIVUP(SN, BN) -#define WRK (NBM * NBN) - -#define UM (SM / BK) -#define VM (SM % UM) - - -__attribute__((reqd_work_group_size(WG, 1, 1))) -#if (0 < SG) -__attribute__((intel_reqd_sub_group_size(SG))) -#endif -kernel void -FN(global T* restrict cdata, CONSTANT const T* restrict adata, CONSTANT const T* restrict bdata, - CONSTANT const int* restrict param_stack, -#if (1 < BS) - int param_format, int stack_size, int bs) { - const int gid = get_group_id(0), idx = get_local_id(0); -#else - int param_format) { - const int gid = get_group_id(0), idx = get_local_id(0), bs = 1; -#endif - const SINT pzero = (0 == param_format ? 1 : 0), pnext = (0 == param_format ? 3 : 6); - /* param_stack/indexes can be one-based (Fortran) depending on param_format */ - CONSTANT const int* restrict param_base = param_stack + gid * (pnext * bs) + (0 == param_format ? 0 : 3); -#if defined(SLM_P) && (1 < BS) - local int params[3 * BS]; /* bs <= BS */ -#else - CONSTANT const int* restrict params = param_base; -#endif -#if defined(SLM_A) -# if (1 != BK || BM < SM || 1 != BN) - local T amk[SM][SK + SLM_A - 1]; -# else - local T amk[SM]; -# endif -#elif defined(REG_A) && (1 != BK) - T amk[SK]; -#endif -#if defined(SLM_B) - local T bnk[SN][SK + SLM_B - 1]; /* tile */ -#endif -#if (BM < SM || 1 != BN) -# if defined(REG_A) && !defined(SLM_A) && (1 == BK) - T amk[BM]; -# endif -# if defined(REG_B) && !defined(SLM_B) -# if (1 != BN) - T bnk[BN][SK]; /* rows */ -# else - T bnk[SK]; /* row */ -# endif -# endif -# if !defined(SLM_C) && (1 < BS) -# if (1 != BN) - T cnm[BN][BM]; /* general tile */ -# else - T cnm[BM]; /* column-block */ -# endif -# endif - const int m0 = (idx / NBN) * BM, n0 = (idx % NBN) * BN; -#else -# if defined(REG_A) && !defined(SLM_A) && (1 == BK) - T amk[SM]; -# endif -# if defined(REG_B) && !defined(SLM_B) - T bnk[SK]; /* row */ -# endif -# if !defined(SLM_C) && (1 < BS) - T cnm[SM]; /* column */ -# endif -#endif -#if defined(TRACK_B) && (1 < BS) && defined(REG_B) && !defined(SLM_B) - int b1 = -1; -#endif - -#if (1 < BS) - /* intra-kernel mini-batch of SMMs */ - const int batchsize = min(bs, stack_size - bs * gid); - int c0; -# if defined(SLM_C) - local T cnm[SN][SM + SLM_C - 1]; /* tile in SLM */ - UNROLL_AUTO for (SINT n = (SINT)idx; n < SN; n += WG) { UNROLL_FORCE(SM) for (SINT m = 0; m < SM; ++m) cnm[n][m] = ZERO; } -# elif (BM < SM || 1 != BN) -# if (1 != BN) - UNROLL(BN) - for (SINT bn = 0; bn < BN; ++bn) -# endif - { - UNROLL_FORCE(BM) for (SINT bm = 0; bm < BM; ++bm) CNM(bn, bm) = ZERO; - } -# else - UNROLL_FORCE(SM) for (SINT m = 0; m < SM; ++m) cnm[m] = ZERO; -# endif -# if defined(SLM_P) - UNROLL_AUTO for (int i = idx; i < batchsize; i += WG) { - UNROLL_FORCE(3) for (int j = 0; j < 3; ++j) { params[3 * i + j] = param_base[pnext * i + j] - pzero; } - } -# endif -# if defined(BARRIER) && (MAX(1, SG) < WG) && (defined(SLM_C) || defined(SLM_P)) - BARRIER(CLK_LOCAL_MEM_FENCE); -# endif -# if (WRK < WG) - if (WRK <= idx) return; /* WRK <= idx */ -# endif -# if defined(SLM_P) - c0 = params[2]; -# else - c0 = params[2] - pzero; -# endif -# if defined(BSC) && (1 != BK) && (1 != UM) - UNROLL_OUTER(REPEAT * BS) -# else - UNROLL_FORCE(1) -# endif -# if (1 < REPEAT) - for (int item = 0; item < (REPEAT * batchsize); ++item) { - const int i = item % batchsize; -# else - for (int item = 0; item < (REPEAT * batchsize); ++item) { - const int i = item; -# endif -# if defined(SLM_P) - const int idxstride = 3, idxbase = 0; -# else - const int idxstride = pnext, idxbase = pzero; -# endif - const int a0 = params[idxstride * i] - idxbase, b0 = params[idxstride * i + 1] - idxbase; - const int c1 = ((i + 1) < batchsize ? (params[idxstride * i + idxstride + 2] - idxbase) : -1); -#else -# if (WRK < WG) - if (WRK > idx) /* WRK > idx */ -# endif - { - const int a0 = params[0] - pzero, b0 = params[1] - pzero, c0 = params[2] - pzero; -#endif - -#if defined(SLM_A) && (1 != BK || BM < SM || 1 != BN) - { /* copy or transpose A-matrix into SLM */ - int m = idx; -# if (WRK != SM) - UNROLL_AUTO for (; m < SM; m += WRK) -# endif - { - UNROLL_FORCE(SK) for (SINT k = 0; k < SK; ++k) amk[m][k] = ADX(m, k); - } - } -#endif - -#if defined(SLM_B) - { /* copy or transpose B-matrix into SLM */ - int n = idx; -# if (WRK != SN) - UNROLL_AUTO for (; n < SN; n += WRK) -# endif - { - UNROLL(SK) for (SINT k = 0; k < SK; ++k) bnk[n][k] = BDX(k, n); - } - } -#elif defined(REG_B) -# if defined(TRACK_B) && (1 < BS) - if (b0 != b1) { - b1 = b0; -# else - { /* copy or transpose B-matrix into registers */ -# endif - UNROLL(SK) for (SINT k = 0; k < SK; ++k) { -# if (BM < SM || 1 != BN) - SINT bn = 0; -# if (1 != BN) - UNROLL_FORCE(BN) - for (; bn < BN; ++bn) -# endif - { -# if (SN % BN) - const int n = min(bn + n0, SN - 1); -# else - const int n = bn + n0; -# endif - BNK(bn, k) = BDX(k, n); - } -# else - bnk[k] = BDX(k, idx); -# endif - } - } -#endif - -#if defined(BARRIER) && (MAX(1, SG) < WG) && (defined(SLM_B) || ((1 != BK || BM < SM || 1 != BN) && defined(SLM_A))) - /* finish transpose/copy */ - BARRIER(CLK_LOCAL_MEM_FENCE); -#endif - -#if (BM < SM || 1 != BN) - { /* calculate result-tile using general tiles */ -# if defined(REG_A) && !defined(SLM_A) && (1 != BK) -# if (1 == BS) - T cnm[BN]; /* row */ - UNROLL_FORCE(BN) for (SINT n = 0; n < BN; ++n) cnm[n] = ZERO; -# endif -# if (SM % BM) - UNROLL(BM) - for (SINT bm = 0, m = m0; bm < BM && m < SM; m = ++bm + m0) -# else - UNROLL(BM) - for (SINT bm = 0, m = m0; bm < BM; m = ++bm + m0) -# endif - { /* general BK, A in registers */ - SINT bn = 0; - UNROLL_FORCE(SK) for (SINT k = 0; k < SK; ++k) amk[k] = ADX(m, k); -# if (1 != BN) - UNROLL(BN) - for (; bn < BN; ++bn) -# endif - { -# if (SN % BN) || (defined(SLM_C) && (1 < BS)) || !defined(REG_B) - const int n = bn + n0; -# endif -# if (SN % BN) - if (n < SN) /* n < SN */ -# endif - { -# if defined(SLM_C) && (1 < BS) - const int mc = m, nc = n; -# elif (1 < BS) - const int mc = bm, nc = bn; -# else - const int mc = bn, nc = idx; -# endif - UNROLL_FORCE(SK) for (SINT k = 0; k < SK; ++k) { - CNM(nc, mc) = MAD(AMK(m, k), -# if defined(REG_B) - BNK(bn, k), -# else - BNK(n, k), -# endif - CNM(nc, mc)); - } - } - } -# if (1 == BS) - bn = 0; -# if (1 != BN) - UNROLL(BN) - for (; bn < BN; ++bn) -# endif - { -# if defined(ATOMIC_INC_NZ) - if (ZERO != CNM(idx, bn)) -# endif - { - ACCUMULATE(&CDX(m, bn + n0), CNM(idx, bn)); - CNM(idx, bn) = ZERO; /* reset */ - } - } -# endif - } -# elif (1 == BK) -# if (1 == BS) - T cnm[BM]; /* column-block */ - UNROLL_FORCE(BM) for (SINT m = 0; m < BM; ++m) cnm[m] = ZERO; -# endif - UNROLL(SK) for (SINT k = 0; k < SK; ++k) { -# if (SN % BN) || !defined(REG_B) || (defined(SLM_C) && (1 < BS)) || (1 == BS) || (1 != BN) - SINT bn = 0; -# endif -# if defined(REG_A) && !defined(SLM_A) - UNROLL_FORCE(BM) for (SINT bm = 0; bm < BM; ++bm) amk[bm] = ADX(bm + m0, k); -# endif -# if (1 != BN) - UNROLL(BN) - for (; bn < BN; ++bn) -# endif - { /* BK=1 */ -# if (SN % BN) || !defined(REG_B) || (defined(SLM_C) && (1 < BS)) || (1 == BS) - const int n = bn + n0; -# endif -# if (SN % BN) - if (n < SN) /* n < SN */ -# endif - { -# if defined(REG_B) - const T b = BNK(bn, k); -# else - const T b = BNK(n, k); -# endif -# if (SM % BM) - UNROLL(BM) - for (SINT bm = 0, m = m0; bm < BM && m < SM; m = ++bm + m0) -# else - UNROLL_FORCE(BM) - for (SINT bm = 0, m = m0; bm < BM; m = ++bm + m0) -# endif - { -# if defined(REG_A) && !defined(SLM_A) - const T a = AMK(bm, k); -# else - const T a = AMK(m, k); -# endif -# if defined(SLM_C) && (1 < BS) - CNM(n, m) = MAD(a, b, CNM(n, m)); -# else - CNM(bn, bm) = MAD(a, b, CNM(bn, bm)); -# endif - } -# if (1 == BS) - UNROLL(BM) for (SINT bm = 0; bm < BM; ++bm) { -# if defined(ATOMIC_INC_NZ) - if (ZERO != CNM(idx, bm)) -# endif - { - ACCUMULATE(&CDX(bm + m0, n), CNM(idx, bm)); - CNM(idx, bm) = ZERO; /* reset */ - } - } -# endif - } - } - } -# else /* general BK */ - SINT bn = 0; -# if (1 != BN) - UNROLL(BN) - for (; bn < BN; ++bn) -# endif - { -# if (SN % BN) || !defined(REG_B) || (defined(SLM_C) && (1 < BS)) || (1 == BS) - const int n = bn + n0; -# endif -# if (SN % BN) - if (n < SN) /* n < SN */ -# endif - { /* general BK */ -# if (1 == BS) - T cnm[BM]; /* column-block */ - UNROLL_FORCE(BM) for (SINT m = 0; m < BM; ++m) cnm[m] = ZERO; -# endif -# if (SM % BM) - UNROLL(BM) - for (SINT bm = 0, m = m0; bm < BM && m < SM; m = ++bm + m0) -# else - UNROLL(BM) - for (SINT bm = 0, m = m0; bm < BM; m = ++bm + m0) -# endif - { -# if defined(SLM_C) && (1 < BS) -# if (1 < BS) && (defined(SLM_C) || (BM < SM && 1 != BN)) - const int mc = m, nc = n; -# else - const int mc = m; -# endif -# else -# if (1 < BS) && (defined(SLM_C) || (BM < SM && 1 != BN)) - const int mc = bm, nc = bn; -# else - const int mc = bm; -# endif -# endif -# if defined(REG_B) - const int nb = bn; -# else - const int nb = n; -# endif - UNROLL_FORCE(SK) for (SINT k = 0; k < SK; ++k) CNM(nc, mc) = MAD(AMK(m, k), BNK(nb, k), CNM(nc, mc)); - } -# if (1 == BS) - UNROLL(BM) for (SINT bm = 0; bm < BM; ++bm) { -# if defined(ATOMIC_INC_NZ) - if (ZERO != CNM(idx, bm)) -# endif - { - ACCUMULATE(&CDX(bm + m0, n), CNM(idx, bm)); - CNM(idx, bm) = ZERO; /* reset */ - } - } -# endif - } - } -# endif - } -#else /* BM == SM && 1 == BN */ - { /* calculate result-tile using columns */ -# if (1 == BS) - T cnm[UM]; /* column-block */ - UNROLL_FORCE(UM) for (SINT m = 0; m < UM; ++m) cnm[m] = ZERO; -# endif -# if (1 == BK) - UNROLL_OUTER(SK) for (SINT k = 0; k < SK; ++k) { - const T b = BNK(idx, k); -# if defined(SLM_A) -# if (WRK != SM) - UNROLL_AUTO for (SINT m = (SINT)idx; m < SM; m += WRK) amk[m] = ADX(m, k); -# else - amk[idx] = ADX(idx, k); -# endif -# elif defined(REG_A) - UNROLL_FORCE(SM) for (SINT m = 0; m < SM; ++m) amk[m] = ADX(m, k); -# endif -# if defined(BARRIER) && (MAX(1, SG) < WG) && defined(SLM_A) - BARRIER(CLK_LOCAL_MEM_FENCE); -# endif -# if defined(ACC_OPENCL_VERSION) && (200 /*2.0*/ <= ACC_OPENCL_VERSION) && (!defined(GPU) || (0 != GPU)) && !defined(SLM_A) && \ - !defined(REG_A) && (WRK == SM) && (SM <= SG || SM <= WG) /* use ACC_OPENCL_VERSION rather than ACC_OPENCL_C_VERSION */ - const T a = AMK(idx, k); - UNROLL_FORCE(SM) for (SINT m = 0; m < SM; ++m) { -# if (SM <= SG) - CNM(idx, m) = MAD(sub_group_broadcast(a, m), b, CNM(idx, m)); /* size of subgroup is sufficient */ -# else - CNM(idx, m) = MAD(work_group_broadcast(a, m), b, CNM(idx, m)); /* size of workgroup is sufficient */ -# endif - } -# else - UNROLL_FORCE(SM) for (SINT m = 0; m < SM; ++m) CNM(idx, m) = MAD(AMK(m, k), b, CNM(idx, m)); /* fallback */ -# endif -# if defined(BARRIER) && (MAX(1, SG) < WG) && defined(SLM_A) - BARRIER(CLK_LOCAL_MEM_FENCE); -# endif - } -# if (1 == BS) - UNROLL(SM) for (SINT m = 0; m < SM; ++m) { -# if defined(ATOMIC_INC_NZ) - if (ZERO != CNM(idx, m)) -# endif - { - ACCUMULATE(&CDX(m, idx), CNM(idx, m)); - CNM(idx, m) = ZERO; /* reset */ - } - } -# endif -# else - SINT m = 0, u; -# if (1 == UM) - UNROLL_OUTER(SM) -# else - UNROLL_AUTO -# endif - for (; m < (SM - UM + 1); m += UM) { - u = 0; -# if (1 < UM) - UNROLL(UM) - for (; u < UM; ++u) -# endif - { - const int um = u + m; -# if (1 < BS) - const int vm = um; -# else - const int vm = u; -# endif -# if defined(REG_A) && !defined(SLM_A) - UNROLL_FORCE(SK) for (SINT k = 0; k < SK; ++k) amk[k] = ADX(um, k); -# endif - UNROLL_FORCE(SK) for (SINT k = 0; k < SK; ++k) { CNM(idx, vm) = MAD(AMK(um, k), BNK(idx, k), CNM(idx, vm)); } - } -# if (1 == BS) - u = 0; -# if (1 < UM) - UNROLL(UM) - for (; u < UM; ++u) -# endif -# if defined(ATOMIC_INC_NZ) - if (ZERO != CNM(idx, u)) -# endif - { - ACCUMULATE(&CDX(u + m, idx), CNM(idx, u)); - CNM(idx, u) = ZERO; /* reset */ - } -# endif - } -# if (0 < VM) - /* calculate remainder */ - u = 0; -# if (1 < VM) - UNROLL(VM) - for (; u < VM; ++u) -# endif - { - const int um = u + m; -# if (1 < BS) - const int vm = um; -# else - const int vm = u; -# endif -# if defined(REG_A) && !defined(SLM_A) - UNROLL_FORCE(SK) for (SINT k = 0; k < SK; ++k) amk[k] = ADX(um, k); -# endif - UNROLL_FORCE(SK) for (SINT k = 0; k < SK; ++k) { CNM(idx, vm) = MAD(AMK(um, k), BNK(idx, k), CNM(idx, vm)); } - } -# if (1 == BS) - u = 0; -# if (1 < VM) - UNROLL(VM) - for (; u < VM; ++u) -# endif -# if defined(ATOMIC_INC_NZ) - if (ZERO != CNM(idx, u)) -# endif - { - ACCUMULATE(&CDX(u + m, idx), CNM(idx, u)); - CNM(idx, u) = ZERO; /* reset */ - } -# endif -# endif -# endif - } -#endif - -#if (1 < BS) -# if defined(TRACK_C) - if (c0 != c1) -# endif -# if (BM < SM || 1 != BN) - { /* atomically commit C-tile to global memory */ - SINT bn = 0; -# if (1 != BN) - UNROLL(BN) - for (; bn < BN; ++bn) -# endif - { - const int n = bn + n0; -# if (SN % BN) - if (n < SN) /* n < SN */ -# endif - { -# if (SM % BM) - UNROLL(BM) - for (SINT bm = 0, m = m0; bm < BM && m < SM; m = ++bm + m0) -# else - UNROLL_FORCE(BM) - for (SINT bm = 0, m = m0; bm < BM; m = ++bm + m0) -# endif - { -# if defined(SLM_C) -# if (1 < BS) && (defined(SLM_C) || (BM < SM && 1 != BN)) - const int mc = m, nc = n; -# else - const int mc = m; -# endif -# else -# if (1 < BS) && (defined(SLM_C) || (BM < SM && 1 != BN)) - const int mc = bm, nc = bn; -# else - const int mc = bm; -# endif -# endif -# if defined(ATOMIC_INC_NZ) - if (ZERO != CNM(nc, mc)) -# endif - { - ACCUMULATE(&CDX(m, n), CNM(nc, mc)); - CNM(nc, mc) = ZERO; /* reset */ - } - } - } - } -# else - { /* atomically commit C-column to global memory */ - SINT m = 0; -# if defined(ATOMIC_ADD2_GLOBAL) - UNROLL_AUTO for (; m < (SM - 1); m += 2) { -# if defined(ATOMIC_INC_NZ) - if (ZERO != CNM(idx, m) && ZERO != CNM(idx, m + 1)) -# endif - { - const float2 r2 = (float2)(CNM(idx, m), CNM(idx, m + 1)); - ATOMIC_ADD2_GLOBAL(&CDX(m, idx), r2); - CNM(idx, m) = CNM(idx, m + 1) = ZERO; /* reset */ - } - } -# else - UNROLL(SM) -# endif -# if !defined(ATOMIC_ADD2_GLOBAL) || (SM & 1) - for (; m < SM; ++m) { -# if defined(ATOMIC_INC_NZ) - if (ZERO != CNM(idx, m)) -# endif - { - ACCUMULATE(&CDX(m, idx), CNM(idx, m)); - CNM(idx, m) = ZERO; /* reset */ - } - } -# endif -# endif - /* next iteration */ - c0 = c1; - } -#endif -#if defined(BARRIER) && (MAX(1, SG) < WG) && defined(SLM_A) && (BM <= SM || 1 != BN || 1 != BK) - BARRIER(CLK_LOCAL_MEM_FENCE); -#endif - } -} diff --git a/src/acc/opencl/smm/kernels/transpose.cl b/src/acc/opencl/smm/kernels/transpose.cl deleted file mode 100644 index 6dbd53c2a37..00000000000 --- a/src/acc/opencl/smm/kernels/transpose.cl +++ /dev/null @@ -1,63 +0,0 @@ -/*------------------------------------------------------------------------------------------------*/ -/* Copyright (C) by the DBCSR developers group - All rights reserved */ -/* This file is part of the DBCSR library. */ -/* */ -/* For information on the license, see the LICENSE file. */ -/* For further information please visit https://dbcsr.cp2k.org */ -/* SPDX-License-Identifier: BSD-3-Clause */ -/*------------------------------------------------------------------------------------------------*/ - -__attribute__((reqd_work_group_size(WG, 1, 1))) kernel void FN( - int trs_offset, CONSTANT const int* restrict trs_stack, global T* restrict matrix) { - /* offset in the transpose-stack that this block ID should handle */ - const int offset = trs_stack[trs_offset + get_group_id(0)]; - /* matrix according to the index (transpose-stack) */ - global T* const restrict mat = matrix + offset; - const int idx = get_local_id(0); -#if (SM != SN) || (0 == INPLACE) - /* local memory buffer */ - local T buf[SM][SN]; -#endif -#if (WG == SM) - const int m = idx; -# if (SM != SN) || (0 == INPLACE) - /* copy matrix elements into local buffer */ - for (int n = 0; n < SN; ++n) buf[m][n] = mat[SM * n + m]; - barrier(CLK_LOCAL_MEM_FENCE); - /* overwrite matrix elements (gather) */ - for (int n = 0; n < SN; ++n) mat[SN * m + n] = buf[m][n]; -# else - for (int n = 0; n < m; ++n) { - const int i = SM * n + m; - const int j = SN * m + n; - const T tmp = mat[i]; - mat[i] = mat[j]; - mat[j] = tmp; - } -# endif -#else - T prv[SN]; /* private buffer */ -# if (SM != SN) || (0 == INPLACE) - /* copy matrix elements into local buffer */ - for (int m = idx; m < SM; m += WG) { - for (int n = 0; n < SN; ++n) buf[m][n] = mat[SM * n + m]; - } - barrier(CLK_LOCAL_MEM_FENCE); -# endif - for (int m = idx; m < SM; m += WG) { -# if (SM != SN) || (0 == INPLACE) - for (int n = 0; n < SN; ++n) prv[n] = buf[m][n]; - /* overwrite matrix elements (gather) */ - for (int n = 0; n < SN; ++n) mat[SN * m + n] = prv[n]; -# else - for (int n = 0; n < SN; ++n) prv[n] = mat[SM * n + m]; - for (int n = 0; n < m; ++n) { - const int i = SM * n + m; - const int j = SN * m + n; - mat[i] = mat[j]; - mat[j] = prv[n]; - } -# endif - } -#endif -} diff --git a/src/acc/opencl/smm/opencl_libsmm.c b/src/acc/opencl/smm/opencl_libsmm.c deleted file mode 100644 index 65295353734..00000000000 --- a/src/acc/opencl/smm/opencl_libsmm.c +++ /dev/null @@ -1,1281 +0,0 @@ -/*------------------------------------------------------------------------------------------------*/ -/* Copyright (C) by the DBCSR developers group - All rights reserved */ -/* This file is part of the DBCSR library. */ -/* */ -/* For information on the license, see the LICENSE file. */ -/* For further information please visit https://dbcsr.cp2k.org */ -/* SPDX-License-Identifier: BSD-3-Clause */ -/*------------------------------------------------------------------------------------------------*/ -#if defined(__OPENCL) -# include "opencl_libsmm.h" -/* Header opencl_kernels.h is generated by the build system using acc_opencl.sh */ -# include "opencl_kernels.h" -# include "../../acc_bench.h" -# include -# if !defined(OPENCL_KERNELS_SOURCE_TRANSPOSE) -# error "OpenCL transpose-kernel code not found!" -# endif -# if !defined(OPENCL_KERNELS_SOURCE_MULTIPLY) -# error "OpenCL SMM-kernel code not found!" -# endif -# if LIBXSMM_VERSION4(1, 17, 0, 0) < LIBXSMM_VERSION_NUMBER -# define OPENCL_LIBSMM_DESCINIT(BLOB, PREC, M, N, K, LDA, LDB, LDC, FLAGS, PREFETCH) \ - libxsmm_gemm_descriptor_init(BLOB, PREC, PREC, PREC, PREC, M, N, K, LDA, LDB, LDC, FLAGS, PREFETCH) -# else -# define OPENCL_LIBSMM_DESCINIT(BLOB, PREC, M, N, K, LDA, LDB, LDC, FLAGS, PREFETCH) \ - libxsmm_gemm_descriptor_dinit(BLOB, PREC, M, N, K, LDA, LDB, LDC, 1.0, 1.0, FLAGS, PREFETCH) -# endif -# if !defined(OPENCL_LIBSMM_KERNELNAME_TRANS) -# define OPENCL_LIBSMM_KERNELNAME_TRANS "trans" -# endif -# if !defined(OPENCL_LIBSMM_KERNELNAME_SMM) -# define OPENCL_LIBSMM_KERNELNAME_SMM "smm" -# endif -# if !defined(OPENCL_LIBSMM_NLOCKS_TRANS) -# define OPENCL_LIBSMM_NLOCKS_TRANS 16 -# endif -# if !defined(OPENCL_LIBSMM_NLOCKS_SMM) -# define OPENCL_LIBSMM_NLOCKS_SMM 16 -# endif -# if !defined(OPENCL_LIBSMM_TODO) && 0 -# define OPENCL_LIBSMM_TODO -# endif -/* default: decompose C-matrix into column-vectors (BMxBN) */ -# if !defined(OPENCL_LIBSMM_DEFAULT_BM) -# define OPENCL_LIBSMM_DEFAULT_BM INT_MAX -# endif -# if !defined(OPENCL_LIBSMM_DEFAULT_BN) -# define OPENCL_LIBSMM_DEFAULT_BN 1 -# endif -# if !defined(OPENCL_LIBSMM_DEFAULT_BK) -# if 1 -# define OPENCL_LIBSMM_DEFAULT_BK INT_MAX -# else -# define OPENCL_LIBSMM_DEFAULT_BK 1 -# endif -# endif -# if !defined(OPENCL_LIBSMM_DEFAULT_BS) -# define OPENCL_LIBSMM_DEFAULT_BS 8 -# endif -# if !defined(OPENCL_LIBSMM_BS_MIN) && 1 -# define OPENCL_LIBSMM_BS_MIN 32 -# endif -# if !defined(OPENCL_LIBSMM_SMM_S) -# define OPENCL_LIBSMM_SMM_S 64 -# endif -# if !defined(OPENCL_LIBSMM_VMIN) -# define OPENCL_LIBSMM_VMIN 8 -# endif - -/* approximate arithmetic intensity for SMMs like C += Ai * Bi (beta=1) */ -# define OPENCL_LIBSMM_AI(M, N, K, TYPESIZE) ((2.0 * (M) * (N) * (K)) / ((TYPESIZE) * (K) * ((M) + (N)))) -/* determine type-size of a given type-ID */ -# define OPENCL_LIBSMM_TYPESIZE(TYPEID) \ - (dbcsr_type_real_8 == (TYPEID) ? ((int)sizeof(double)) : (dbcsr_type_real_4 == (TYPEID) ? ((int)sizeof(float)) : 0 /*unknown*/)) - -# define OPENCL_LIBSMM_TRANSENV(KEY) opencl_libsmm_getenv("OPENCL_LIBSMM_TRANS", KEY) -# define OPENCL_LIBSMM_SMMENV(KEY) opencl_libsmm_getenv("OPENCL_LIBSMM_SMM", KEY) - - -# if defined(__cplusplus) -extern "C" { -# endif - -/* Pointer to DBM kernel-launch function (optional, can be NULL) */ -opencl_libsmm_acc_dbm_launch_fn_t opencl_libsmm_acc_dbm_launch_fn; -/* track initialization status of LIBSMM */ -int opencl_libsmm_initialized; - - -int opencl_libsmm_write_trans_params(FILE* stream, int only_key, const opencl_libsmm_transkey_t* key, - const opencl_libsmm_trans_t* config, const char* delim, const char* begin, const char* close) { - int result = 0; - if (NULL != stream) { - const char d = (NULL == delim ? *ACC_OPENCL_DELIMS : *delim); - if (NULL != key || 0 == only_key) result += fprintf(stream, "%c", NULL == begin ? '{' : *begin); - if (NULL != config) { - if (NULL != key) { - result += fprintf(stream, "%i%c%i%c%i", (int)key->type, d, key->m, d, key->n); - /*if (0 == only_key) result += fprintf(stream, "%c", d);*/ - } - } - else { - if (NULL != key) { - result += fprintf(stream, "t%cm%cn", d, d); - /*if (0 == only_key) result += fprintf(stream, "%c", d);*/ - } - } - if (NULL != key || 0 == only_key) result += fprintf(stream, "%c", NULL == close ? '}' : *close); - } - else result = -1; - assert(0 < result); - return result; -} - - -int opencl_libsmm_write_smm_params(FILE* stream, int only_key, const opencl_libsmm_smmkey_t* key, const opencl_libsmm_smm_t* config, - const char* delim, const char* begin, const char* close) { - int result = 0; - if (NULL != stream) { - const char d = (NULL == delim ? *ACC_OPENCL_DELIMS : *delim); - if (NULL != key || 0 == only_key) result += fprintf(stream, "%c", NULL == begin ? '{' : *begin); - if (NULL != config) { - if (NULL != key) { - result += fprintf(stream, "%i%c%i%c%i%c%i", (int)key->type, d, key->m, d, key->n, d, key->k); - if (0 == only_key) result += fprintf(stream, "%c ", d); - } - if (0 == only_key) { - result += fprintf(stream, "%i%c%i%c%i%c%i%c %i%c%i%c %i%c%i%c%i%c %i%c%i%c %i%c%i%c%i%c%i", config->bs, d, config->bm, d, - config->bn, d, config->bk, d, config->ws, d, config->wg, d, config->lu, d, config->nz, d, config->al, d, config->tb, d, - config->tc, d, config->ap, d, config->aa, d, config->ab, d, config->ac); - if (0 != config->flags) result += fprintf(stream, "%c %i", d, config->flags); - } - } - else { - if (NULL != key) { - result += fprintf(stream, "t%cm%cn%ck", d, d, d); - if (0 == only_key) result += fprintf(stream, "%c ", d); - } - if (0 == only_key) { - result += fprintf( - stream, "bs%cbm%cbn%cbk%c ws%cwg%c lu%cnz%cal%c tb%ctc%c ap%caa%cab%cac", d, d, d, d, d, d, d, d, d, d, d, d, d, d); - } - } - if (NULL != key || 0 == only_key) result += fprintf(stream, "%c", NULL == close ? '}' : *close); - } - else result = -1; - assert(0 < result); - return result; -} - - -int opencl_libsmm_read_smm_params(char* parambuf, opencl_libsmm_smmkey_t* key, opencl_libsmm_smm_t* value, - opencl_libsmm_perfest_t* perfest, char* device, int* key_ok) { - const char* const end = parambuf + strlen(parambuf); /* before strtok */ - char* s = strtok(parambuf, ACC_OPENCL_DELIMS); - const int opt_consumed = (NULL != perfest ? 2 : 0) + (NULL != device ? 1 : 0); - int result = EXIT_SUCCESS, i = 0, ivalue, consumed = 0, c = 0, max_consumed = opt_consumed + 19; - double gflops; - assert(NULL != key && NULL != value); - LIBXSMM_MEMZERO127(key); /* potentially heterogeneous key-data (alignment gaps) */ - memset(value, 0, sizeof(opencl_libsmm_smm_t)); - for (; NULL != s; - ++i, s = (c != consumed ? ((s + 1) < end ? strtok((s + 1) + strlen(s), ACC_OPENCL_DELIMS) : NULL) : s), c = consumed) - { - switch (i) { - case 0: - if (NULL != device && 1 == sscanf(s, "%[^" ACC_OPENCL_DELIMS "]", device)) { - ++consumed; /* optional device name */ - } - break; - case 1: - if (1 == sscanf(s, "%i", &ivalue)) { - key->type = (libsmm_acc_data_t)ivalue; - ++consumed; - } - break; - case 2: - if (1 == sscanf(s, "%i", &ivalue) && 0 < ivalue) { - key->m = ivalue; - ++consumed; - } - break; - case 3: - if (1 == sscanf(s, "%i", &ivalue) && 0 < ivalue) { - key->n = ivalue; - ++consumed; - } - break; - case 4: - if (1 == sscanf(s, "%i", &ivalue) && 0 < ivalue) { - key->k = ivalue; - ++consumed; - } - break; - case 5: - if (NULL != perfest && 1 == sscanf(s, "%i", &ivalue)) { - value->s = ivalue; - ++consumed; /* optional "S" param */ - } - break; - case 6: - if (NULL != perfest && 1 == sscanf(s, "%lf", &gflops) && 0 <= gflops) { - value->gflops = gflops; - ++consumed; /* optional "GFLOPS" param */ - } - break; - case 7: - if (1 == sscanf(s, "%i", &ivalue)) { - value->bs = ivalue; - ++consumed; - } - break; - case 8: - if (1 == sscanf(s, "%i", &ivalue)) { - value->bm = ivalue; - ++consumed; - } - break; - case 9: - if (1 == sscanf(s, "%i", &ivalue)) { - value->bn = ivalue; - ++consumed; - } - break; - case 10: - if (1 == sscanf(s, "%i", &ivalue)) { - value->bk = ivalue; - ++consumed; - } - break; - case 11: - if (1 == sscanf(s, "%i", &ivalue)) { - value->ws = ivalue; - ++consumed; - } - break; - case 12: - if (1 == sscanf(s, "%i", &ivalue)) { - value->wg = ivalue; - ++consumed; - } - break; - case 13: - if (1 == sscanf(s, "%i", &ivalue)) { - value->lu = ivalue; - ++consumed; - } - break; - case 14: - if (1 == sscanf(s, "%i", &ivalue)) { - value->nz = ivalue; - ++consumed; - } - break; - case 15: - if (1 == sscanf(s, "%i", &ivalue)) { - value->al = ivalue; - ++consumed; - } - break; - case 16: - if (1 == sscanf(s, "%i", &ivalue)) { - value->tb = ivalue; - ++consumed; - } - break; - case 17: - if (1 == sscanf(s, "%i", &ivalue)) { - value->tc = ivalue; - ++consumed; - } - break; - case 18: - if (1 == sscanf(s, "%i", &ivalue)) { - value->ap = ivalue; - ++consumed; - } - break; - case 19: - if (1 == sscanf(s, "%i", &ivalue)) { - value->aa = ivalue; - ++consumed; - } - break; - case 20: - if (1 == sscanf(s, "%i", &ivalue)) { - value->ab = ivalue; - ++consumed; - } - break; - case 21: - if (1 == sscanf(s, "%i", &ivalue)) { - value->ac = ivalue; - ++consumed; - } - break; - case 22: - if (1 == sscanf(s, "%i", &ivalue)) { - value->flags = ivalue; - ++max_consumed; - ++consumed; - } - break; - default: s = NULL; /* break */ - } - } - if (max_consumed == consumed) { - switch (key->type) { - case dbcsr_type_real_8: - if (NULL != perfest && 0 < gflops) { - const double ratio = gflops / OPENCL_LIBSMM_AI(key->m, key->n, key->k, sizeof(double)); -# if LIBXSMM_VERSION4(1, 17, 0, 0) < LIBXSMM_VERSION_NUMBER - libxsmm_kahan_sum(log(ratio), &perfest->gf_ai_dratio_sumlog, &perfest->gf_ai_dratio_kahan); -# else - perfest->gf_ai_dratio_sumlog += log(ratio); -# endif - if (perfest->gf_ai_dratio_max < ratio) perfest->gf_ai_dratio_max = ratio; - ++perfest->dcount; - } - break; - case dbcsr_type_real_4: - if (NULL != perfest && 0 < gflops) { - const double ratio = gflops / OPENCL_LIBSMM_AI(key->m, key->n, key->k, sizeof(float)); -# if LIBXSMM_VERSION4(1, 17, 0, 0) < LIBXSMM_VERSION_NUMBER - libxsmm_kahan_sum(log(ratio), &perfest->gf_ai_sratio_sumlog, &perfest->gf_ai_sratio_kahan); -# else - perfest->gf_ai_sratio_sumlog += log(ratio); -# endif - if (perfest->gf_ai_sratio_max < ratio) perfest->gf_ai_sratio_max = ratio; - ++perfest->scount; - } - break; - default: result = EXIT_FAILURE; - } - } - else result = EXIT_FAILURE; - if (NULL != key_ok && 4 <= consumed) *key_ok = 1; - return result; -} - - -int libsmm_acc_init(void) { -# if defined(_OPENMP) - /* initialization/finalization is not meant to be thread-safe */ - int result = ((0 == omp_in_parallel() || /*main*/ 0 == omp_get_thread_num()) ? EXIT_SUCCESS : EXIT_FAILURE); -# pragma omp critical(opencl_libsmm_initialized) -# else - int result = EXIT_SUCCESS; -# endif - ++opencl_libsmm_initialized; - /* multiple calls to libsmm_acc_init are not considered as an error */ - if (1 == opencl_libsmm_initialized) { -# if !defined(__DBCSR_ACC) - /* DBCSR shall call c_dbcsr_acc_init as well as libsmm_acc_init (since both interfaces are used). - * Also, libsmm_acc_init may privately call c_dbcsr_acc_init (as it depends on the ACC interface). - * The implementation of c_dbcsr_acc_init should hence be safe against "over initialization". - * However, DBCSR only calls c_dbcsr_acc_init (and expects an implicit libsmm_acc_init). - */ - if (EXIT_SUCCESS == result) result = c_dbcsr_acc_init(); -# endif - libxsmm_init(); - if (EXIT_SUCCESS == result) { - opencl_libsmm_perfest_t perfest; - char* const env_params = getenv("OPENCL_LIBSMM_SMM_PARAMS"); /* !opencl_libsmm_getenv */ - memset(&perfest, 0, sizeof(perfest)); - if (NULL == env_params || '0' != *env_params) { - char buffer[ACC_OPENCL_BUFFERSIZE], bufname[ACC_OPENCL_BUFFERSIZE]; -# if defined(OPENCL_KERNELS_DEVICES) - const int ndevices_params = (int)(sizeof(OPENCL_KERNELS_DEVICES) / sizeof(*OPENCL_KERNELS_DEVICES)); -# endif - opencl_libsmm_smm_t config; - opencl_libsmm_smmkey_t key, key_direct; - int key_direct_skip = 0, ntuned = 0; - if (NULL != env_params && '\0' != *env_params) { /* filename */ - FILE* const file = fopen(env_params, "r"); - if (NULL != file) { - /* consume first line, check for device entry, and skip CSV header */ - if (NULL != fgets(buffer, ACC_OPENCL_BUFFERSIZE, file)) { - char* const device = (NULL != LIBXSMM_STRISTR(buffer, "device") ? bufname : NULL); - opencl_libsmm_perfest_t* const gflops = (NULL != LIBXSMM_STRISTR(buffer, "gflops") ? &perfest : NULL); - while (NULL != fgets(buffer, ACC_OPENCL_BUFFERSIZE, file)) { /* read params from CSV-file */ - if (EXIT_SUCCESS == opencl_libsmm_read_smm_params(buffer, &key, &config, gflops, device, NULL /*key_ok*/)) { - opencl_libsmm_smm_t* config_init; - c_dbcsr_acc_opencl_config.devmatch = 0; /* disable device-match */ - key.devuid = 0; - config_init = (opencl_libsmm_smm_t*)libxsmm_xdispatch(&key, sizeof(key)); - if (NULL == config_init) { - if (NULL == libxsmm_xregister(&key, sizeof(key), sizeof(config), &config)) { - result = EXIT_FAILURE; - break; - } - else ++ntuned; - } - else if (config_init->gflops < config.gflops) { /* update */ - memcpy(config_init, &config, sizeof(config)); - } - } - else { - if (0 != c_dbcsr_acc_opencl_config.verbosity) { - fprintf(stderr, "WARN LIBSMM: failed to load tuned parameters from CSV-file!\n"); - } - break; /* invalid entry */ - } - } - } - else { /* invalid header */ - result = EXIT_FAILURE; - } - fclose(file); - } - else if (EXIT_SUCCESS == opencl_libsmm_read_smm_params( - env_params, &key_direct, &config, NULL /*perfest*/, NULL /*device*/, &key_direct_skip)) - { /* try OPENCL_LIBSMM_SMM_PARAMS as string of kernel parameters (not device-specific) */ - assert(0 == key_direct.devuid && 0 != key_direct_skip); - if (NULL != libxsmm_xregister(&key_direct, sizeof(key_direct), sizeof(config), &config)) { - c_dbcsr_acc_opencl_config.devmatch = 0; /* disable device-match */ - ntuned = 1; - } - else result = EXIT_FAILURE; - } - else if (0 == key_direct_skip && 0 != c_dbcsr_acc_opencl_config.verbosity) { /* soft-error */ - fprintf(stderr, "WARN LIBSMM: failed to open parameter file!\n"); - } - } -# if defined(OPENCL_KERNELS_PARAMS_SMM) && defined(OPENCL_KERNELS_DEVICES) - if (EXIT_SUCCESS == result && (0 == ntuned || 0 != key_direct_skip)) { - const char *line = OPENCL_KERNELS_PARAMS_SMM, *next; -# if LIBXSMM_VERSION4(1, 17, 0, 0) < LIBXSMM_VERSION_NUMBER - const cl_device_id device_id = c_dbcsr_acc_opencl_config.devices[c_dbcsr_acc_opencl_config.device_id]; - unsigned int default_uid = c_dbcsr_acc_opencl_config.device.uid; - int active_match = -1; - if (EXIT_SUCCESS == c_dbcsr_acc_opencl_device_name( - device_id, bufname, ACC_OPENCL_BUFFERSIZE, NULL /*platform*/, 0 /*platform_maxlen*/, /*cleanup*/ 1)) - { /* determine best-matching parameters based on name of device */ - int i = 0, count = 0; - double best = 0; - if (1 >= c_dbcsr_acc_opencl_config.devmatch) { - c_dbcsr_acc_opencl_device_uid(device_id, bufname, &default_uid); - } - for (; i < ndevices_params; ++i) { - const int n = c_dbcsr_acc_opencl_strimatch(bufname, OPENCL_KERNELS_DEVICES[i], NULL, &count); - if (0 != n && 0 != count) { - const double score = (double)n / count; - unsigned int uid; - if (best < score || - (EXIT_SUCCESS == c_dbcsr_acc_opencl_device_uid(NULL /*device*/, OPENCL_KERNELS_DEVICES[i], &uid) && - uid == default_uid)) - { - active_match = i; - best = score; - } - } - } - } -# endif - do { - next = strchr(line, '\n'); - if (NULL != next && next < (line + ACC_OPENCL_BUFFERSIZE)) { - const int len = next - line; - memcpy(buffer, line, len); - buffer[len] = '\0'; - if (EXIT_SUCCESS == opencl_libsmm_read_smm_params(/* read params from embedded params */ - buffer, &key, &config, &perfest, bufname /*consume name/id*/, NULL /*key_ok*/)) - { - if (0 == key_direct_skip || 0 != memcmp(&key_direct, &key, (const char*)&key.k - (const char*)&key)) { - opencl_libsmm_smm_t* config_init; - const int i = atoi(bufname); - if (0 >= ndevices_params || 0 == c_dbcsr_acc_opencl_config.devmatch || 0 > i || ndevices_params <= i || - EXIT_SUCCESS != c_dbcsr_acc_opencl_device_uid(NULL /*device*/, OPENCL_KERNELS_DEVICES[i], &key.devuid)) - { - key.devuid = 0; - } - config_init = (opencl_libsmm_smm_t*)libxsmm_xdispatch(&key, sizeof(key)); /* duplicate? */ - if (NULL == config_init) { - if (NULL != libxsmm_xregister(&key, sizeof(key), sizeof(config), &config)) ++ntuned; - else { /* failed to register */ - result = EXIT_FAILURE; - break; - } - } - else if (config_init->gflops < config.gflops) { /* update */ - memcpy(config_init, &config, sizeof(config)); - } -# if LIBXSMM_VERSION4(1, 17, 0, 0) < LIBXSMM_VERSION_NUMBER - if (active_match == i && 0 != default_uid) { - key.devuid = default_uid; - config_init = (opencl_libsmm_smm_t*)libxsmm_xdispatch(&key, sizeof(key)); - if (NULL != config_init || NULL != libxsmm_xregister(&key, sizeof(key), sizeof(config), &config)) { - static int info = 0; - if (0 == info && 0 == c_dbcsr_acc_opencl_config.nrank && 0 != c_dbcsr_acc_opencl_config.verbosity && - EXIT_SUCCESS == c_dbcsr_acc_opencl_device_name(device_id, bufname, ACC_OPENCL_BUFFERSIZE, - NULL /*platform*/, 0 /*platform_maxlen*/, /*cleanup*/ 0)) - { - assert(i < ndevices_params); - if (default_uid != key.devuid) { - fprintf(/* print best-matching device */ - stderr, "INFO ACC/LIBSMM: PARAMS of \"%s\" used for \"%s\"\n", OPENCL_KERNELS_DEVICES[i], bufname); - } - else { - fprintf( - stderr, "INFO ACC/LIBSMM: PARAMS of \"%s\" used to instantiate kernels\n", OPENCL_KERNELS_DEVICES[i]); - } - info = 1; - } - } - } -# endif - } - } - else { - if (0 != c_dbcsr_acc_opencl_config.verbosity) { - fprintf(stderr, "WARN LIBSMM: failed to load embedded parameters!\n"); - } - break; - } - line = ++next; - } - } while (NULL != next); - } -# endif -# if defined(OPENCL_KERNELS_DEVICES) - if (EXIT_SUCCESS == result && 0 != ntuned && 0 == c_dbcsr_acc_opencl_config.nrank && - (2 <= c_dbcsr_acc_opencl_config.verbosity || 0 > c_dbcsr_acc_opencl_config.verbosity)) - { - fprintf(stderr, "INFO ACC/LIBSMM: PARAMS in %i set%s loaded targeting ", ntuned, 1 != ntuned ? "s" : ""); - if (0 != c_dbcsr_acc_opencl_config.devmatch) { - fprintf(stderr, "%i device%s\n", ndevices_params, 1 != ndevices_params ? "s" : ""); - if (3 <= c_dbcsr_acc_opencl_config.verbosity || 0 > c_dbcsr_acc_opencl_config.verbosity) { - unsigned int i = 0; - for (; i < (unsigned int)ndevices_params; ++i) { - fprintf(stderr, "INFO ACC/LIBSMM: PARAMS -> \"%s\"\n", OPENCL_KERNELS_DEVICES[i]); - } - } - } - else fprintf(stderr, "any device\n"); - } -# endif - } - } - } - ACC_OPENCL_RETURN(result); -} - - -int libsmm_acc_finalize(void) { - /* Routine libsmm_acc_init is called in master thread inside of parallel region - * However, libsmm_acc_finalize is indirectly called (c_dbcsr_acc_finalize) - * inside of a parallel region (not just the master thread). - */ -# if defined(_OPENMP) - /* initialization/finalization is not meant to be thread-safe */ - int result = ((0 == omp_in_parallel() || /*main*/ 0 == omp_get_thread_num()) ? EXIT_SUCCESS : EXIT_FAILURE); -# pragma omp critical(opencl_libsmm_initialized) -# else - int result = EXIT_SUCCESS; -# endif - --opencl_libsmm_initialized; - /* multiple calls to libsmm_acc_finalize are not considered as an error */ - if (0 == opencl_libsmm_initialized) { -# if LIBXSMM_VERSION4(1, 17, 0, 0) < LIBXSMM_VERSION_NUMBER - char fname[ACC_OPENCL_MAXSTRLEN]; - const void* regentry = libxsmm_get_registry_begin(LIBXSMM_KERNEL_KIND_USER, NULL /*key*/); - for (; NULL != regentry; regentry = libxsmm_get_registry_next(regentry, NULL /*key*/)) { - /* opencl_libsmm_trans_t/opencl_libsmm_smm_t carry cl_kernel as 1st data member */ - cl_kernel kernel = *(const cl_kernel*)regentry; - if (NULL == kernel) kernel = ((const opencl_libsmm_smm_t*)regentry)->kernel[1]; - if (NULL != kernel) { /* only consider user-entry if clGetKernelInfo succeeded */ - int result_entry = clGetKernelInfo(kernel, CL_KERNEL_FUNCTION_NAME, sizeof(fname), fname, NULL); - if (EXIT_SUCCESS == result_entry) { - if (NULL != strstr(fname, OPENCL_LIBSMM_KERNELNAME_TRANS)) { /* trans-kernel */ - result_entry = clReleaseKernel(kernel); - } - else if (NULL != strstr(fname, OPENCL_LIBSMM_KERNELNAME_SMM)) { /* SMM-kernel */ - result_entry = clReleaseKernel(kernel); - if (EXIT_SUCCESS == result_entry && kernel != ((const opencl_libsmm_smm_t*)regentry)->kernel[1]) { - kernel = ((const opencl_libsmm_smm_t*)regentry)->kernel[1]; /* release 2nd kernel */ - if (NULL != kernel) result_entry = clReleaseKernel(kernel); - } - } - if (EXIT_SUCCESS != result_entry) result = result_entry; - } - } - } -# endif -# if !defined(__DBCSR_ACC) - /* DBCSR shall call c_dbcsr_acc_init as well as libsmm_acc_init (since both interfaces are used). - * Also, libsmm_acc_init may privately call c_dbcsr_acc_init (as it depends on the ACC interface). - * The implementation of c_dbcsr_acc_init should hence be safe against "over initialization". - * However, DBCSR only calls c_dbcsr_acc_init (and expects an implicit libsmm_acc_init). - */ - if (EXIT_SUCCESS == result) result = c_dbcsr_acc_finalize(); -# endif - libxsmm_finalize(); - } - /* c_dbcsr_acc_finalize is not called since it can be used independently */ - return result; -} - - -c_dbcsr_acc_bool_t libsmm_acc_is_thread_safe(void) { - /* match DBCSR's threading level */ -# if defined(_OPENMP) - return 1; -# else - return 0; -# endif -} - - -const char* opencl_libsmm_getenv(const char domain[], const char key[]) { - char buffer[ACC_OPENCL_BUFFERSIZE]; - const size_t keylen = strlen(key); - const char* result = NULL; - int nchar; - if (2 != keylen) { - nchar = LIBXSMM_SNPRINTF(buffer, sizeof(buffer), "%s_%s", domain, key); - if (0 < nchar && (int)sizeof(buffer) > nchar) result = getenv(buffer); - } - else { - nchar = LIBXSMM_SNPRINTF(buffer, sizeof(buffer), "%s_PARAMS", domain); - if (0 < nchar && (int)sizeof(buffer) > nchar) result = getenv(buffer); - if (NULL == result || '0' != *result) { - nchar = LIBXSMM_SNPRINTF(buffer, sizeof(buffer), "%s_%s", domain, key); - result = (0 < nchar && (int)sizeof(buffer) > nchar) ? getenv(buffer) : NULL; - } - else { - result = NULL; - } - } - return result; -} - - -int libsmm_acc_transpose(const int* dev_trs_stack, int offset, int stack_size, void* dev_data, libsmm_acc_data_t datatype, int m, - int n, int max_kernel_dim, void* stream) { - c_dbcsr_acc_opencl_info_memptr_t info_stack, info_mdata; - int result = EXIT_SUCCESS; - const int mn = m * n; - assert((NULL != dev_trs_stack && NULL != stream && NULL != dev_data && 0 <= offset && 0 < stack_size) || 0 == stack_size); - assert(0 < m && 0 < n); - if (0 == stack_size || 1 == mn) return EXIT_SUCCESS; - result |= c_dbcsr_acc_opencl_info_devptr(&info_stack, dev_trs_stack, sizeof(int), NULL /*amount*/, NULL /*offset*/); - result |= c_dbcsr_acc_opencl_info_devptr(&info_mdata, dev_data, 1 /*elsize*/, NULL /*amount*/, NULL /*offset*/); - if (EXIT_SUCCESS == result && - ( -# if defined(OPENCL_LIBSMM_F64) - dbcsr_type_real_8 == datatype -# else - 0 -# endif - || -# if defined(OPENCL_LIBSMM_F32) - dbcsr_type_real_4 == datatype -# else - 0 -# endif - ) && - mn <= (max_kernel_dim * max_kernel_dim)) - { - const libxsmm_timer_tickint start = libxsmm_timer_tick(); - const c_dbcsr_acc_opencl_stream_t* const str = ACC_OPENCL_STREAM(stream); - opencl_libsmm_trans_t* config; - opencl_libsmm_transkey_t key; - LIBXSMM_MEMZERO127(&key); /* potentially heterogeneous key-data (alignment gaps) */ - key.type = datatype; - key.m = m; - key.n = n; /* initialize key */ - config = (opencl_libsmm_trans_t*)libxsmm_xdispatch(&key, sizeof(key)); - if (NULL == config) { - char buffer[ACC_OPENCL_BUFFERSIZE], build_params[ACC_OPENCL_BUFFERSIZE]; - char fname[ACC_OPENCL_MAXSTRLEN]; - int nchar = LIBXSMM_SNPRINTF(fname, sizeof(fname), - /* kernel name are meant to be unambiguous (BLAS-typeprefix and kernelsize) */ - "x" OPENCL_LIBSMM_KERNELNAME_TRANS "%ix%i", m, n); -# if defined(__DBCSR_ACC) - int routine_handle; - c_dbcsr_timeset(LIBSMM_ACC_TRANSPOSE_ROUTINE_NAME_STRPTR, LIBSMM_ACC_TRANSPOSE_ROUTINE_NAME_LENPTR, &routine_handle); -# endif - if (0 < nchar && (int)sizeof(fname) > nchar) { - const cl_device_id device_id = c_dbcsr_acc_opencl_config.devices[c_dbcsr_acc_opencl_config.device_id]; - const c_dbcsr_acc_opencl_device_t* const devinfo = &c_dbcsr_acc_opencl_config.device; - const char *const env_cl = OPENCL_LIBSMM_TRANSENV("BUILDOPTS"), *const env_bm = OPENCL_LIBSMM_TRANSENV("BM"); - const char* const cmem = (EXIT_SUCCESS != c_dbcsr_acc_opencl_use_cmem(devinfo) ? "global" : "constant"); - const char* const build_format = "-DCONSTANT=%s -DINPLACE=%i -DFN=%s -DSM=%i -DSN=%i -DWG=%i -DT=%s"; - const char *const env_inplace = OPENCL_LIBSMM_TRANSENV("INPLACE"), *tname = ""; -# if defined(OPENCL_LIBSMM_TRANS_INPLACE) - const int inplace = ((m == n) && (NULL == env_inplace ? 1 : ('0' != *env_inplace))); -# else - const int inplace = ((m == n) && (NULL == env_inplace ? 0 : ('0' != *env_inplace))); -# endif - const int blockm = ((NULL == env_bm || '\0' == *env_bm) ? 0 : atoi(env_bm)); - const int bm = (0 >= blockm ? m : LIBXSMM_MIN(blockm, m)); - opencl_libsmm_trans_t new_config; - memset(&new_config, 0, sizeof(new_config)); - switch (datatype) { - case dbcsr_type_real_8: { - tname = "char8"; /* double */ - fname[0] = 'd'; - } break; - case dbcsr_type_real_4: { - tname = "float"; - fname[0] = 's'; - } break; - default: assert('\0' == *tname); - } - new_config.wgsize = LIBXSMM_MIN((size_t)((m == bm || 0 == (m % bm)) ? bm : m), devinfo->wgsize[0]); - nchar = LIBXSMM_SNPRINTF(buffer, sizeof(buffer), "%s", NULL == env_cl ? "" : env_cl); - if (0 <= /*<*/ nchar && (int)sizeof(buffer) > nchar) { - nchar = LIBXSMM_SNPRINTF( - build_params, sizeof(build_params), build_format, cmem, inplace, fname, m, n, (int)new_config.wgsize, tname); - } - if ('\0' != *tname && 0 < nchar && (int)sizeof(build_params) > nchar) { - result = c_dbcsr_acc_opencl_kernel(0 /*source_kind*/, OPENCL_KERNELS_SOURCE_TRANSPOSE, fname, build_params, buffer, - NULL /*try*/, NULL /*try_ok*/, NULL /*extnames*/, 0 /*num_exts*/, &new_config.kernel); - if (EXIT_SUCCESS == result) { - size_t wgsize_max; - assert(NULL != new_config.kernel); - result = clGetKernelWorkGroupInfo( - new_config.kernel, device_id, CL_KERNEL_WORK_GROUP_SIZE, sizeof(size_t), &wgsize_max, NULL); - if (EXIT_SUCCESS == result) { - assert(0 < wgsize_max); - if (wgsize_max < new_config.wgsize) { - new_config.wgsize = wgsize_max; - nchar = LIBXSMM_SNPRINTF( - build_params, sizeof(build_params), build_format, cmem, inplace, fname, m, n, (int)new_config.wgsize, tname); - if (0 < nchar && (int)sizeof(build_params) > nchar) { - result = c_dbcsr_acc_opencl_kernel(0 /*source_kind*/, OPENCL_KERNELS_SOURCE_TRANSPOSE, fname, build_params, - buffer, NULL /*try*/, NULL /*try_ok*/, NULL /*extnames*/, 0 /*num_exts*/, &new_config.kernel); - } - else result = EXIT_FAILURE; - } - if (EXIT_SUCCESS == result) { - config = (opencl_libsmm_trans_t*)libxsmm_xregister(&key, sizeof(key), sizeof(new_config), &new_config); - if (2 <= c_dbcsr_acc_opencl_config.verbosity || 0 > c_dbcsr_acc_opencl_config.verbosity) { - const double duration = libxsmm_timer_duration(start, libxsmm_timer_tick()); - LIBXSMM_STDIO_ACQUIRE(); - fprintf(stderr, "INFO ACC/LIBSMM: TRANS-kernel "); - opencl_libsmm_write_trans_params( - stderr, 0 /*only_key*/, &key, NULL /*config*/, NULL /*delim*/, NULL /*begin*/, NULL /*close*/); - fprintf(stderr, "="); - opencl_libsmm_write_trans_params( - stderr, 0 /*only_key*/, &key, config, NULL /*delim*/, NULL /*begin*/, NULL /*close*/); - fprintf(stderr, " gen=%.1f ms\n", 1E3 * duration); - LIBXSMM_STDIO_RELEASE(); - } - } - } - } - } - else if (EXIT_SUCCESS == result) { - result = EXIT_FAILURE; - } - } - else { - result = EXIT_FAILURE; - } -# if defined(__DBCSR_ACC) - c_dbcsr_timestop(&routine_handle); -# endif - } - assert((NULL != config && NULL != config->kernel && 0 < config->wgsize) || EXIT_SUCCESS != result); - if (EXIT_SUCCESS == result) { - const size_t work_size = config->wgsize * stack_size; - assert(!(OPENCL_LIBSMM_NLOCKS_TRANS & (OPENCL_LIBSMM_NLOCKS_TRANS - 1))); /* POT */ - { /* calling clSetKernelArg/clEnqueueNDRangeKernel must be consistent */ - static ACC_OPENCL_ATOMIC_LOCKTYPE locks[OPENCL_LIBSMM_NLOCKS_TRANS]; -# if (1 < OPENCL_LIBSMM_NLOCKS_TRANS) - const unsigned int hash = libxsmm_hash(&config->kernel, sizeof(cl_kernel), 25071975 /*seed*/); - const unsigned int lidx = LIBXSMM_MOD2(hash, OPENCL_LIBSMM_NLOCKS_TRANS); - ACC_OPENCL_ATOMIC_LOCKTYPE* const lock = locks + lidx; -# else - ACC_OPENCL_ATOMIC_LOCKTYPE* const lock = locks; -# endif - ACC_OPENCL_ATOMIC_ACQUIRE(lock); - ACC_OPENCL_CHECK( - result, clSetKernelArg(config->kernel, 0, sizeof(int), &offset), "set offset argument of transpose kernel"); - ACC_OPENCL_CHECK(result, c_dbcsr_acc_opencl_set_kernel_ptr(config->kernel, 1, info_stack.memory), - "set batch-list argument of transpose kernel"); - ACC_OPENCL_CHECK(result, c_dbcsr_acc_opencl_set_kernel_ptr(config->kernel, 2, info_mdata.memory), - "set matrix-data argument of transpose kernel"); - ACC_OPENCL_CHECK(result, - clEnqueueNDRangeKernel( - str->queue, config->kernel, 1 /*work_dim*/, NULL /*offset*/, &work_size, &config->wgsize, 0, NULL, NULL), - "launch transpose kernel"); - /* eventually update performance counters inside of locked region */ - if ((3 <= c_dbcsr_acc_opencl_config.verbosity || 0 > c_dbcsr_acc_opencl_config.verbosity) && EXIT_SUCCESS == result) { - LIBXSMM_STDIO_ACQUIRE(); - fprintf(stderr, "INFO ACC/LIBSMM: TRANS-kernel "); - opencl_libsmm_write_trans_params( - stderr, 1 /*only_key*/, &key, NULL /*config*/, NULL /*delim*/, NULL /*begin*/, NULL /*close*/); - fprintf(stderr, "="); - opencl_libsmm_write_trans_params(stderr, 1 /*only_key*/, &key, config, NULL /*delim*/, NULL /*begin*/, NULL /*close*/); - fprintf(stderr, " ss=%i\n", stack_size); - LIBXSMM_STDIO_RELEASE(); - } - ACC_OPENCL_ATOMIC_RELEASE(lock); - } - } - } - else if (EXIT_SUCCESS == result) result = EXIT_FAILURE; - ACC_OPENCL_RETURN(result); -} - - -c_dbcsr_acc_bool_t libsmm_acc_process_suitable( - c_dbcsr_acc_bool_t def_mnk, libsmm_acc_data_t datatype, int stack_size, int m_max, int n_max, int k_max, int max_kernel_dim) { - c_dbcsr_acc_bool_t result = 0; /* false */ - const int mn = m_max * n_max; - if (0 < mn && 0 < k_max && 0 < stack_size && - 0 != def_mnk /*homogeneous*/ - /* allow k_max to exceed max_kernel_dim, TODO: BLAS for large kernels (m,n) */ - && mn <= (max_kernel_dim * max_kernel_dim)) - { - switch (datatype) { -# if defined(OPENCL_LIBSMM_F64) - case dbcsr_type_real_8: { - result = 1; /* true */ - } break; -# endif -# if defined(OPENCL_LIBSMM_F32) - case dbcsr_type_real_4: { - result = 1; /* true */ - } break; -# endif - default: assert(/*false*/ 0 == result); - } - } - if ((/*false*/ 0 == result) && (2 <= c_dbcsr_acc_opencl_config.verbosity || 0 > c_dbcsr_acc_opencl_config.verbosity)) { - opencl_libsmm_smmkey_t key; - opencl_libsmm_smm_t dummy; - key.type = datatype; - key.m = m_max; - key.n = n_max; - key.k = k_max; /* initialize key */ - memset(&dummy, 0, sizeof(dummy)); /* mute warnings about potentially uninitialized data */ - LIBXSMM_STDIO_ACQUIRE(); - fprintf(stderr, "INFO ACC/LIBSMM: SMM-kernel "); - opencl_libsmm_write_smm_params(stderr, 1 /*only_key*/, &key, NULL /*config*/, NULL /*delim*/, NULL /*begin*/, NULL /*close*/); - fprintf(stderr, "="); - opencl_libsmm_write_smm_params(stderr, 1 /*only_key*/, &key, &dummy, NULL /*delim*/, NULL /*begin*/, NULL /*close*/); - fprintf(stderr, " ss=%i", stack_size); - if (mn <= (max_kernel_dim * max_kernel_dim)) { - fprintf(stderr, 0 != def_mnk ? " is ignored\n" : " is inhomogeneous\n"); - } - else fprintf(stderr, " is too large\n"); - LIBXSMM_STDIO_RELEASE(); - } - return result; -} - - -# if defined(OPENCL_LIBSMM_PFORMAT) && (0 < OPENCL_LIBSMM_PFORMAT) -void opencl_libsmm_acc_set_dbm_launch_fn(opencl_libsmm_acc_dbm_launch_fn_t launch_fn) { - opencl_libsmm_acc_dbm_launch_fn = launch_fn; -} -# else -int opencl_libsmm_acc_process(const int* host_param_stack, const int* dev_param_stack, int stack_size, libsmm_acc_data_t datatype, - const void* dev_a_data, const void* dev_b_data, void* dev_c_data, int m_max, int n_max, int k_max, int max_kernel_dim, - c_dbcsr_acc_bool_t def_mnk, void* stream, void* c_stream, int param_format, cl_event* event); -# endif -int opencl_libsmm_acc_process(const int* host_param_stack, const int* dev_param_stack, int stack_size, libsmm_acc_data_t datatype, - const void* dev_a_data, const void* dev_b_data, void* dev_c_data, int m_max, int n_max, int k_max, int max_kernel_dim, - c_dbcsr_acc_bool_t def_mnk, void* stream, void* c_stream, int param_format, cl_event* event) { - int result = EXIT_SUCCESS; - LIBXSMM_UNUSED(host_param_stack); /* TODO */ - LIBXSMM_UNUSED(c_stream); /* TODO */ - assert(0 == stack_size || (NULL != dev_a_data && NULL != dev_b_data && NULL != dev_c_data && NULL != dev_param_stack)); - assert(0 < max_kernel_dim && NULL != stream && 0 <= stack_size && 0 <= m_max && 0 <= n_max && 0 <= k_max); - if (0 != libsmm_acc_process_suitable(def_mnk, datatype, stack_size, m_max, n_max, k_max, max_kernel_dim)) { - const libxsmm_timer_tickint start = libxsmm_timer_tick(); - const c_dbcsr_acc_opencl_device_t* const devinfo = &c_dbcsr_acc_opencl_config.device; - c_dbcsr_acc_opencl_info_memptr_t info_stack, info_adata, info_bdata, info_cdata; - opencl_libsmm_smmkey_t key; - const c_dbcsr_acc_opencl_stream_t* const str = ACC_OPENCL_STREAM(stream); - LIBXSMM_MEMZERO127(&key); /* potentially heterogeneous key-data */ - key.devuid = ((1 != c_dbcsr_acc_opencl_config.devmatch && ((unsigned int)-1) != c_dbcsr_acc_opencl_config.devmatch) - ? c_dbcsr_acc_opencl_config.devmatch - : devinfo->uid); - key.type = datatype; - key.m = m_max; - key.n = n_max; - key.k = k_max; - result |= c_dbcsr_acc_opencl_info_devptr(&info_stack, dev_param_stack, sizeof(int), NULL /*amount*/, NULL /*offset*/); - result |= c_dbcsr_acc_opencl_info_devptr(&info_adata, dev_a_data, 1 /*elsize*/, NULL /*amount*/, NULL /*offset*/); - result |= c_dbcsr_acc_opencl_info_devptr(&info_bdata, dev_b_data, 1 /*elsize*/, NULL /*amount*/, NULL /*offset*/); - result |= c_dbcsr_acc_opencl_info_devptr(&info_cdata, dev_c_data, 1 /*elsize*/, NULL /*amount*/, NULL /*offset*/); - if (EXIT_SUCCESS == result) { - static ACC_OPENCL_ATOMIC_LOCKTYPE locks[OPENCL_LIBSMM_NLOCKS_SMM]; - const char *const env_s = OPENCL_LIBSMM_SMMENV("S"), *const env_bs = OPENCL_LIBSMM_SMMENV("BS"); - const int s = ((NULL == env_s || '\0' == *env_s) ? OPENCL_LIBSMM_SMM_S : atoi(env_s)); - int kernel_idx = 0, bs = ((NULL == env_bs || '\0' == *env_bs) ? 0 : atoi(env_bs)); - opencl_libsmm_smm_t* config; - ACC_OPENCL_ATOMIC_LOCKTYPE* lock = locks; -# if (1 < OPENCL_LIBSMM_NLOCKS_SMM) - assert(!(OPENCL_LIBSMM_NLOCKS_SMM & (OPENCL_LIBSMM_NLOCKS_SMM - 1))); /* POT */ - lock += LIBXSMM_MOD2(libxsmm_hash(&key, sizeof(key), 25071975 /*seed*/), OPENCL_LIBSMM_NLOCKS_SMM); -# endif - ACC_OPENCL_ATOMIC_ACQUIRE(lock); /* calling clSetKernelArg/clEnqueueNDRangeKernel must be consistent */ - config = (opencl_libsmm_smm_t*)libxsmm_xdispatch(&key, sizeof(key)); - if (0 >= bs) bs = ((NULL != config && 0 < config->bs) ? config->bs : OPENCL_LIBSMM_DEFAULT_BS); - /* determine kernel-kind (mini-batch vs. mini-kernel) */ - if (1 == bs || 0 > s || (bs * s) > stack_size) kernel_idx = bs = 1; - if (NULL == config || NULL == config->kernel[kernel_idx]) { - char buffer[ACC_OPENCL_BUFFERSIZE], build_params[ACC_OPENCL_BUFFERSIZE], fname[ACC_OPENCL_MAXSTRLEN]; - int nchar = LIBXSMM_SNPRINTF(fname, sizeof(fname), - /* kernel name are meant to be unambiguous (BLAS-typeprefix and kernelsize) */ - "x" OPENCL_LIBSMM_KERNELNAME_SMM "%ix%ix%i", m_max, n_max, k_max); -# if defined(__DBCSR_ACC) - int routine_handle; - c_dbcsr_timeset(LIBSMM_ACC_PROCESS_ROUTINE_NAME_STRPTR, LIBSMM_ACC_PROCESS_ROUTINE_NAME_LENPTR, &routine_handle); -# endif - result = ((0 < nchar && (int)sizeof(fname) > nchar) ? EXIT_SUCCESS : EXIT_FAILURE); - if (EXIT_SUCCESS == result) { - c_dbcsr_acc_opencl_atomic_fp_t tkind = c_dbcsr_acc_opencl_atomic_fp_no; - const char* tname = NULL; - switch (datatype) { - case dbcsr_type_real_8: { - tkind = c_dbcsr_acc_opencl_atomic_fp_64; - tname = "double"; - fname[0] = 'd'; - } break; - case dbcsr_type_real_4: { - tkind = c_dbcsr_acc_opencl_atomic_fp_32; - tname = "float"; - fname[0] = 's'; - } break; - default: assert(NULL == tname); - } - if (NULL != tname) { - const char *extensions[] = {NULL, NULL}, *const env_devid = OPENCL_LIBSMM_SMMENV("DEVID"); - const cl_device_id device_id = c_dbcsr_acc_opencl_config.devices[c_dbcsr_acc_opencl_config.device_id]; - const unsigned int devuid = (NULL == env_devid || '\0' == *env_devid) ? devinfo->uid - : (unsigned int)strtoul(env_devid, NULL, 0); - size_t nextensions = sizeof(extensions) / sizeof(*extensions), sgs = 0, wgsize_prf = 1; - const char *const env_bm = OPENCL_LIBSMM_SMMENV("BM"), *const env_bn = OPENCL_LIBSMM_SMMENV("BN"); - const char *const env_bk = OPENCL_LIBSMM_SMMENV("BK"), *const env_ws = OPENCL_LIBSMM_SMMENV("WS"); - const char *const env_wg = OPENCL_LIBSMM_SMMENV("WG"), *const env_lu = OPENCL_LIBSMM_SMMENV("LU"); - const char *const env_nz = OPENCL_LIBSMM_SMMENV("NZ"), *const env_al = OPENCL_LIBSMM_SMMENV("AL"); - const char *const env_tb = OPENCL_LIBSMM_SMMENV("TB"), *const env_tc = OPENCL_LIBSMM_SMMENV("TC"); - const char *const env_ap = OPENCL_LIBSMM_SMMENV("AP"), *const env_aa = OPENCL_LIBSMM_SMMENV("AA"); - const char *const env_ab = OPENCL_LIBSMM_SMMENV("AB"), *const env_ac = OPENCL_LIBSMM_SMMENV("AC"); - const char *const env_xf = OPENCL_LIBSMM_SMMENV("XF"), *const env_cl = OPENCL_LIBSMM_SMMENV("BUILDOPTS"); - const char* const intel_xf = "-cl-intel-256-GRF-per-thread"; - const int blockn = ((NULL == env_bn || '\0' == *env_bn) ? 0 : atoi(env_bn)); - const int blockk = ((NULL == env_bk || '\0' == *env_bk) ? 0 : atoi(env_bk)); - const int wgmin = ((NULL == env_ws || '\0' == *env_ws) ? 0 : atoi(env_ws)); - const int default_aa = (((0x0bd0 > devuid || 0x0bdb < devuid)) ? ((k_max % OPENCL_LIBSMM_VMIN) ? 1 : 2) : 0); - const int default_ab = (((0x0bd0 > devuid || 0x0bdb < devuid) && 0x020a != devuid) ? 3 : 0), default_ac = 0; - const int default_bk = (((0x0bd0 > devuid || 0x0bdb < devuid || n_max < k_max) && 0x020a != devuid) - ? (0 == kernel_idx ? LIBXSMM_MIN(OPENCL_LIBSMM_DEFAULT_BK, m_max) - : LIBXSMM_MIN(OPENCL_LIBSMM_VMIN, m_max)) - : 1); - const int default_wg = (((0x0bd0 > devuid || 0x0bdb < devuid)) ? (0 == kernel_idx ? 0 : -2) : -1); - const int default_lu = (0 != devinfo->intel ? -1 : 0); - int defaults, blockm, nbm, nbn; - opencl_libsmm_smm_t new_config; - if (NULL == config) { - memset(&new_config, 0, sizeof(new_config)); - } - else { /* preserve kernels, performance counters, etc. */ - memcpy(&new_config, config, sizeof(opencl_libsmm_smm_t)); - } - if (NULL == env_xf || '\0' == *env_xf) { - if (0 != devinfo->intel && CL_DEVICE_TYPE_GPU == devinfo->type && NULL != env_cl && NULL != strstr(env_cl, intel_xf)) - { - new_config.flags = 1; - } - } - else new_config.flags = atoi(env_xf); - defaults = ((NULL == config || 0 != kernel_idx || (NULL != config && new_config.flags != config->flags)) ? 1 : 0); - new_config.lu = LIBXSMM_MAX(-2, (NULL == env_lu || '\0' == *env_lu) ? (0 != defaults ? default_lu : config->lu) - : atoi(env_lu)); /* populate only lower bound */ - blockm = ((NULL == env_bm || '\0' == *env_bm || 1 < new_config.lu) /* 1= new_config.lu ? 0 : LIBXSMM_UP(m_max / new_config.lu, OPENCL_LIBSMM_VMIN)) - : atoi(env_bm)); - /* two defaults for new_config parameters: 1st - regular, 2nd - BS=1 kernel */ - new_config.bm = (0 >= blockm ? (0 == kernel_idx ? (0 != defaults ? LIBXSMM_MIN(OPENCL_LIBSMM_DEFAULT_BM, m_max) - : LIBXSMM_CLMP(config->bm, 1, m_max)) - : LIBXSMM_MIN(OPENCL_LIBSMM_DEFAULT_BM, m_max)) - : LIBXSMM_MIN(blockm, m_max)); - new_config.bn = (0 >= blockn ? (0 == kernel_idx ? (0 != defaults ? LIBXSMM_MIN(OPENCL_LIBSMM_DEFAULT_BN, n_max) - : LIBXSMM_CLMP(config->bn, 1, n_max)) - : LIBXSMM_MIN(OPENCL_LIBSMM_DEFAULT_BN, n_max)) - : LIBXSMM_MIN(blockn, n_max)); - new_config.bk = (0 >= blockk ? (0 != defaults ? default_bk : LIBXSMM_CLMP(config->bk, 1, m_max)) - : LIBXSMM_MIN(blockk, m_max)); - new_config.ws = (0 >= wgmin ? (0 == kernel_idx ? (0 != defaults ? LIBXSMM_MAX(m_max, n_max) - : LIBXSMM_CLMP(config->ws, 1, n_max * m_max)) - : LIBXSMM_MAX(m_max, n_max)) - : LIBXSMM_MIN(wgmin, n_max * m_max)); - new_config.wg = LIBXSMM_CLMP( - (NULL == env_wg || '\0' == *env_wg) ? (0 != defaults ? default_wg : config->wg) : atoi(env_wg), -2, 2); - new_config.nz = LIBXSMM_CLMP( - (NULL == env_nz || '\0' == *env_nz) ? (0 != defaults ? /*default*/ 0 : config->nz) : atoi(env_nz), 0, 1); -# if defined(OPENCL_LIBSMM_TODO) - new_config.al = LIBXSMM_CLMP(/* bug with AL=1 and XF=1? */ - (NULL == env_al || '\0' == *env_al) ? (0 != defaults ? /*default*/ 0 : config->al) : atoi(env_al), 0, 1); -# else - LIBXSMM_UNUSED(env_al); - new_config.al = 0; -# endif - new_config.tb = LIBXSMM_CLMP( - (NULL == env_tb || '\0' == *env_tb) ? (0 != defaults ? /*default*/ 0 : config->tb) : atoi(env_tb), 0, 1); - new_config.tc = LIBXSMM_CLMP( - (NULL == env_tc || '\0' == *env_tc) ? (0 != defaults ? /*default*/ 1 : config->tc) : atoi(env_tc), 0, 1); - new_config.ap = LIBXSMM_CLMP( - (NULL == env_ap || '\0' == *env_ap) ? (0 != defaults ? /*default*/ 0 : config->ap) : atoi(env_ap), 0, 1); - new_config.aa = LIBXSMM_CLMP(/* bug with AA=2 and XF=1? */ - (NULL == env_aa || '\0' == *env_aa) ? (0 != defaults ? default_aa : config->aa) : atoi(env_aa), 0, 2); - new_config.ab = LIBXSMM_CLMP( - (NULL == env_ab || '\0' == *env_ab) ? (0 != defaults ? default_ab : config->ab) : atoi(env_ab), 0, 2); - new_config.ac = LIBXSMM_CLMP( - (NULL == env_ac || '\0' == *env_ac) ? (0 != defaults ? default_ac : config->ac) : atoi(env_ac), 0, 1); - if (0 >= new_config.s) new_config.s = stack_size; - if (0 == kernel_idx || 1 >= new_config.bs) new_config.bs = bs; - nbm = (m_max + new_config.bm - 1) / new_config.bm; - nbn = (n_max + new_config.bn - 1) / new_config.bn; - new_config.wgsize[kernel_idx] = LIBXSMM_MAX(nbm * nbn, new_config.ws); - if (0 != new_config.wg) { - if (1 < devinfo->wgsize[2]) { /* subgroups supported */ - if (new_config.wgsize[kernel_idx] <= devinfo->wgsize[2]) { - sgs = devinfo->wgsize[2]; - } - else if (new_config.wgsize[kernel_idx] <= devinfo->wgsize[1]) { - sgs = devinfo->wgsize[1]; - } - } - wgsize_prf = LIBXSMM_UP(new_config.wgsize[kernel_idx], 0 != sgs ? sgs : devinfo->wgsize[1]); - } - else { /* cover exactly */ - wgsize_prf = new_config.wgsize[kernel_idx]; - } - if (2 <= new_config.wg) wgsize_prf = LIBXSMM_UP2POT(wgsize_prf); - if (wgsize_prf < (2 * new_config.wgsize[kernel_idx])) new_config.wgsize[kernel_idx] = wgsize_prf; /* limit */ - assert(1 <= bs && 0 < new_config.wgsize[kernel_idx] && 0 < wgsize_prf); - /* ensure minimum requested WG-size */ - while ((nbm * nbn) < new_config.ws && (nbm < m_max || nbn < n_max)) { - if (nbn < n_max) ++nbn; - else if (nbm < m_max) ++nbm; - } - if ((nbm * nbn) < new_config.ws) { - new_config.bn = (n_max + nbn - 1) / nbn; - new_config.bm = (m_max + nbm - 1) / nbm; - new_config.wgsize[kernel_idx] = (2 > new_config.wg ? (nbm * nbn) : ((int)LIBXSMM_UP2POT(nbm * nbn))); - } - else { /* reset */ - nbm = (m_max + new_config.bm - 1) / new_config.bm; - nbn = (n_max + new_config.bn - 1) / new_config.bn; - } - /* limit WG-size to maximum WG-size */ - while (devinfo->wgsize[0] < new_config.wgsize[kernel_idx] && (new_config.bm < m_max || new_config.bn < n_max)) { - if (new_config.bn < n_max) { - ++new_config.bn; - nbn = (n_max + new_config.bn - 1) / new_config.bn; - } - else if (new_config.bm < m_max) { - ++new_config.bm; - nbm = (m_max + new_config.bm - 1) / new_config.bm; - } - new_config.wgsize[kernel_idx] = (2 > new_config.wg ? (nbm * nbn) : ((int)LIBXSMM_UP2POT(nbm * nbn))); - } - if (new_config.wgsize[kernel_idx] <= devinfo->wgsize[0]) { /* SMM can be handled by device */ - const char* const cmem = (EXIT_SUCCESS != c_dbcsr_acc_opencl_use_cmem(devinfo) ? "global" : "constant"); - const char* const env_nrepeat = getenv("NREPEAT_SMM"); - const int typesize = OPENCL_LIBSMM_TYPESIZE(datatype); - const int slm_a = (1 != new_config.aa ? 0 : (LIBXSMM_ISPOT(k_max * typesize) + 1)); - const int slm_b = (1 != new_config.ab ? 0 : (LIBXSMM_ISPOT(k_max * typesize) + 1)); - const int slm_c = (1 != new_config.ac ? 0 : (LIBXSMM_ISPOT(m_max * typesize) + 1)); - /* compose build parameters and flags */ - nchar = LIBXSMM_SNPRINTF(build_params, sizeof(build_params), - "-DT=%s -DGPU=%u -DCONSTANT=%s -DWG=%i -DSG=%i -DFN=%s -DREPEAT=%i -DLU=%i " - "-DSM=%i -DSN=%i -DSK=%i -DBS=%i -DVL=%i %s -DBM=%i -DBN=%i -DBK=%i " - "%s %s %s %s %s %s %s %s ", /* space! */ - tname, CL_DEVICE_TYPE_GPU == devinfo->type, cmem, (int)new_config.wgsize[kernel_idx], (int)sgs, fname, - NULL == env_nrepeat ? 1 : atoi(env_nrepeat), new_config.lu, m_max, n_max, k_max, bs, OPENCL_LIBSMM_VMIN, - bs == new_config.bs ? "-DBSC" : "", new_config.bm, new_config.bn, new_config.bk, - 0 == new_config.tb ? "" : "-DTRACK_B", 0 != new_config.tc ? "-DTRACK_C" : "", - 0 == new_config.nz ? "" : "-DATOMIC_INC_NZ", 0 == new_config.al ? "" : "-DAL", 0 == new_config.ap ? "" : "-DSLM_P", - 0 == new_config.aa ? "" : (1 == slm_a ? "-DSLM_A=1" : (0 != slm_a ? "-DSLM_A=2" : "-DREG_A")), - 0 == new_config.ab ? "" : (1 == slm_b ? "-DSLM_B=1" : (0 != slm_b ? "-DSLM_B=2" : "-DREG_B")), - 0 == new_config.ac ? "" : (1 == slm_c ? "-DSLM_C=1" : "-DSLM_C=2")); - /* apply support for FP-atomics */ - if (0 < nchar && (int)sizeof(build_params) > nchar) { - nchar = c_dbcsr_acc_opencl_flags_atomics(&c_dbcsr_acc_opencl_config.device, tkind, extensions, &nextensions, - build_params + nchar, sizeof(build_params) - nchar); - } - else result = EXIT_FAILURE; - if (0 < nchar && (int)sizeof(build_params) > nchar) { - nchar = LIBXSMM_SNPRINTF(buffer, sizeof(buffer), "%s %s%s", - (0 == new_config.flags || 0 == devinfo->intel || CL_DEVICE_TYPE_GPU != devinfo->type) ? "" : intel_xf, - 0 == c_dbcsr_acc_opencl_config.debug ? "-cl-fast-relaxed-math -cl-denorms-are-zero " : "", - NULL == env_cl ? "" : env_cl); - if (0 >= nchar || (int)sizeof(buffer) <= nchar) result = EXIT_FAILURE; - } - else result = EXIT_FAILURE; - } - else { /* matrix-size causes too large WG-size */ - result = EXIT_FAILURE; - } - if (EXIT_SUCCESS == result) { - const char* const env_kernel = OPENCL_LIBSMM_SMMENV("KERNEL"); - result = c_dbcsr_acc_opencl_kernel(NULL == env_kernel ? 0 : 1, - NULL == env_kernel ? OPENCL_KERNELS_SOURCE_MULTIPLY : env_kernel, fname, build_params, buffer, NULL /*cl_try*/, - NULL /*cl_try_ok*/, extensions, nextensions, new_config.kernel + kernel_idx); - if (EXIT_SUCCESS == result) { - size_t wgsize_max_kernel = devinfo->wgsize[0]; - result = clGetKernelWorkGroupInfo( - new_config.kernel[kernel_idx], device_id, CL_KERNEL_WORK_GROUP_SIZE, sizeof(size_t), &wgsize_max_kernel, NULL); - if (EXIT_SUCCESS == result) { - assert(0 < new_config.wgsize[kernel_idx] && 0 < wgsize_max_kernel); - assert(wgsize_max_kernel <= devinfo->wgsize[0]); - if (new_config.wgsize[kernel_idx] <= wgsize_max_kernel) { /* check planned WG-size vs kernel-specific WG-size */ - if (NULL == config || NULL == config->kernel[kernel_idx]) { - config = (opencl_libsmm_smm_t*)libxsmm_xregister(&key, sizeof(key), sizeof(new_config), &new_config); - } - if (NULL != config) { - if (2 <= c_dbcsr_acc_opencl_config.verbosity || 0 > c_dbcsr_acc_opencl_config.verbosity) { - const double duration = libxsmm_timer_duration(start, libxsmm_timer_tick()); - LIBXSMM_STDIO_ACQUIRE(); - fprintf(stderr, "INFO ACC/LIBSMM: SMM-kernel "); - opencl_libsmm_write_smm_params( - stderr, 0 /*only_key*/, &key, NULL /*config*/, NULL /*delim*/, NULL /*begin*/, NULL /*close*/); - fprintf(stderr, "="); - opencl_libsmm_write_smm_params( - stderr, 0 /*only_key*/, &key, &new_config, NULL /*delim*/, NULL /*begin*/, NULL /*close*/); - fprintf(stderr, " gen=%.1f ms\n", 1E3 * duration); - LIBXSMM_STDIO_RELEASE(); - } - } - /* failed to register config */ - else result = EXIT_FAILURE; - } - else { - if (0 != c_dbcsr_acc_opencl_config.verbosity) { - fprintf(stderr, "ERROR LIBSMM: tile-size causes too large WG-size (min(%u,%u) < %u)!\n", - (unsigned int)wgsize_max_kernel, (unsigned int)devinfo->wgsize[0], - (unsigned int)new_config.wgsize[kernel_idx]); - } - result = EXIT_FAILURE; /* tile-size causes too large WG-size */ - } - } - } -# if defined(NDEBUG) - else if (2 <= c_dbcsr_acc_opencl_config.verbosity || 0 > c_dbcsr_acc_opencl_config.verbosity) { - LIBXSMM_STDIO_ACQUIRE(); - fprintf(stderr, "WARNING: SMM-kernel "); - opencl_libsmm_write_smm_params( - stderr, 0 /*only_key*/, &key, NULL /*config*/, NULL /*delim*/, NULL /*begin*/, NULL /*close*/); - fprintf(stderr, "="); - opencl_libsmm_write_smm_params( - stderr, 0 /*only_key*/, &key, &new_config, NULL /*delim*/, NULL /*begin*/, NULL /*close*/); - fprintf(stderr, " failed to compile!\n"); - LIBXSMM_STDIO_RELEASE(); - } -# endif - } - } - /* insufficient device capabilities */ - else result = EXIT_FAILURE; - } - /* remove configuration from registry to avoid infinitely retrying code generation */ - if (EXIT_SUCCESS != result && NULL != config) { - libxsmm_xrelease(&key, sizeof(key)); - } -# if defined(__DBCSR_ACC) - c_dbcsr_timestop(&routine_handle); -# endif - } - assert(EXIT_SUCCESS != result || (NULL != config && NULL != config->kernel[kernel_idx])); - assert(EXIT_SUCCESS != result || (1 <= config->bm && config->bm <= m_max)); - assert(EXIT_SUCCESS != result || (1 <= config->bn && config->bn <= n_max)); - assert(EXIT_SUCCESS != result || (1 <= config->bk && config->bk <= m_max)); - assert(EXIT_SUCCESS != result || (1 <= config->ws && config->ws <= (m_max * n_max))); - assert(EXIT_SUCCESS != result || (-2 <= config->wg && 2 >= config->wg)); - assert(EXIT_SUCCESS != result || (-2 <= config->lu /*&& 2 >= config->lu*/)); - assert(EXIT_SUCCESS != result || (0 <= config->nz && 1 >= config->nz)); - assert(EXIT_SUCCESS != result || (0 <= config->al && 1 >= config->al)); - assert(EXIT_SUCCESS != result || (0 <= config->tb && 1 >= config->tb)); - assert(EXIT_SUCCESS != result || (0 <= config->tc && 1 >= config->tc)); - assert(EXIT_SUCCESS != result || (0 <= config->ap && 1 >= config->ap)); - assert(EXIT_SUCCESS != result || (0 <= config->aa && 2 >= config->aa)); - assert(EXIT_SUCCESS != result || (0 <= config->ab && 2 >= config->ab)); - assert(EXIT_SUCCESS != result || (0 <= config->ac && 1 >= config->ac)); - assert(EXIT_SUCCESS != result || (1 <= config->wgsize[kernel_idx])); - assert(EXIT_SUCCESS != result || (1 <= config->s && 1 <= config->bs)); - if (EXIT_SUCCESS == result) { - size_t work_size; - /* scale intra-kernel batchsize according to stacksize */ - if (0 == kernel_idx && 1 < config->bs && stack_size < config->s) { -# if defined(OPENCL_LIBSMM_BS_MIN) - const int config_bs = LIBXSMM_MAX(config->bs, OPENCL_LIBSMM_BS_MIN); -# else - const int config_bs = config->bs; -# endif - bs = (stack_size * config_bs + config->s - 1) / (config->s - 1); - if (config->bs < bs) bs = config->bs; - } - /* adjust launchsize according to intra-kernel batchsize */ - work_size = ((stack_size + bs - 1) / bs) * config->wgsize[kernel_idx]; - /* calling clSetKernelArg/clEnqueueNDRangeKernel must be consistent */ - ACC_OPENCL_CHECK(result, c_dbcsr_acc_opencl_set_kernel_ptr(config->kernel[kernel_idx], 0, info_cdata.memory), - "set C-matrix argument of SMM-kernel"); - ACC_OPENCL_CHECK(result, c_dbcsr_acc_opencl_set_kernel_ptr(config->kernel[kernel_idx], 1, info_adata.memory), - "set A-matrix argument of SMM-kernel"); - ACC_OPENCL_CHECK(result, c_dbcsr_acc_opencl_set_kernel_ptr(config->kernel[kernel_idx], 2, info_bdata.memory), - "set B-matrix argument of SMM-kernel"); - ACC_OPENCL_CHECK(result, c_dbcsr_acc_opencl_set_kernel_ptr(config->kernel[kernel_idx], 3, info_stack.memory), - "set batch-list argument of SMM-kernel"); - ACC_OPENCL_CHECK(result, clSetKernelArg(config->kernel[kernel_idx], 4, sizeof(int), ¶m_format), - "set batch-format argument of SMM-kernel"); - if (0 == kernel_idx) { - assert(bs <= config->bs); - ACC_OPENCL_CHECK(result, clSetKernelArg(config->kernel[kernel_idx], 5, sizeof(int), &stack_size), - "set stacksize argument of SMM-kernel"); - ACC_OPENCL_CHECK( - result, clSetKernelArg(config->kernel[kernel_idx], 6, sizeof(int), &bs), "set minibatch argument of SMM-kernel"); - } - ACC_OPENCL_CHECK(result, - clEnqueueNDRangeKernel(str->queue, config->kernel[kernel_idx], 1 /*work_dim*/, NULL /*offset*/, &work_size, - config->wgsize + kernel_idx, 0, NULL, event), - "launch SMM-kernel"); - /* eventually update performance counters inside of locked region */ - if ((3 <= c_dbcsr_acc_opencl_config.verbosity || 0 > c_dbcsr_acc_opencl_config.verbosity) && 0 == param_format && - EXIT_SUCCESS == result) - { - LIBXSMM_STDIO_ACQUIRE(); - fprintf(stderr, "INFO ACC/LIBSMM: SMM-kernel "); - opencl_libsmm_write_smm_params( - stderr, 1 /*only_key*/, &key, NULL /*config*/, NULL /*delim*/, NULL /*begin*/, NULL /*close*/); - fprintf(stderr, "="); - opencl_libsmm_write_smm_params(stderr, 1 /*only_key*/, &key, config, NULL /*delim*/, NULL /*begin*/, NULL /*close*/); - fprintf(stderr, " ss=%i\n", stack_size); - LIBXSMM_STDIO_RELEASE(); - } - } - ACC_OPENCL_ATOMIC_RELEASE(lock); - } - } - else if (0 < stack_size) { /* inhomogeneous, large kernel, or unsupported datatype */ - return -1; /* TODO: document result code to trigger host-fallback */ - } - return result; -} - - -int libsmm_acc_process(const int* host_param_stack, const int* dev_param_stack, int stack_size, libsmm_acc_data_t datatype, - const void* dev_a_data, const void* dev_b_data, void* dev_c_data, int m_max, int n_max, int k_max, int max_kernel_dim, - c_dbcsr_acc_bool_t def_mnk, void* stream, void* c_stream) { - int result = EXIT_SUCCESS; -# if defined(OPENCL_LIBSMM_PFORMAT) && (0 < OPENCL_LIBSMM_PFORMAT) - assert(LIBXSMM_MAX(LIBXSMM_MAX(m_max, n_max), k_max) < (1 << (OPENCL_LIBSMM_PFORMAT - 1))); - if (dbcsr_type_real_8 == datatype && 0 != def_mnk && NULL != opencl_libsmm_acc_dbm_launch_fn) { - result = opencl_libsmm_acc_dbm_launch_fn(stream, 1.0 /*alpha*/, stack_size, - m_max | (n_max << OPENCL_LIBSMM_PFORMAT) | (k_max << (OPENCL_LIBSMM_PFORMAT * 2)), host_param_stack, dev_param_stack, - (const double*)dev_a_data, (const double*)dev_b_data, (double*)dev_c_data); - } - else -# endif - { - result = opencl_libsmm_acc_process(host_param_stack, dev_param_stack, stack_size, datatype, dev_a_data, dev_b_data, dev_c_data, - m_max, n_max, k_max, max_kernel_dim, def_mnk, stream, c_stream, 0 /*param_format*/, NULL /*event*/); - } - ACC_OPENCL_RETURN(result); -} - - -int c_calculate_norms(const double* mat, int nblks, const int* offsets, const int* nelems, float* norms, void* stream_ptr) { - LIBXSMM_UNUSED(mat); - LIBXSMM_UNUSED(nblks); - LIBXSMM_UNUSED(offsets); - LIBXSMM_UNUSED(nelems); - LIBXSMM_UNUSED(norms); - LIBXSMM_UNUSED(stream_ptr); - return -1; -} - -# if defined(__cplusplus) -} -# endif - -#endif /*__OPENCL*/ diff --git a/src/acc/opencl/smm/opencl_libsmm.h b/src/acc/opencl/smm/opencl_libsmm.h deleted file mode 100644 index 05eacc1da42..00000000000 --- a/src/acc/opencl/smm/opencl_libsmm.h +++ /dev/null @@ -1,124 +0,0 @@ -/*------------------------------------------------------------------------------------------------*/ -/* Copyright (C) by the DBCSR developers group - All rights reserved */ -/* This file is part of the DBCSR library. */ -/* */ -/* For information on the license, see the LICENSE file. */ -/* For further information please visit https://dbcsr.cp2k.org */ -/* SPDX-License-Identifier: BSD-3-Clause */ -/*------------------------------------------------------------------------------------------------*/ -#ifndef OPENCL_LIBSMM_H -#define OPENCL_LIBSMM_H - -#include "../../acc_libsmm.h" -#include "../acc_opencl.h" - -/* Inplace-transpose by default (corresponding environment variable exists also) */ -#if !defined(OPENCL_LIBSMM_TRANS_INPLACE) && 0 -# define OPENCL_LIBSMM_TRANS_INPLACE -#endif -#if !defined(OPENCL_LIBSMM_F32_OFF) && defined(__DBCSR_ACC) && 0 -# define OPENCL_LIBSMM_F32_OFF -#endif -#if !defined(OPENCL_LIBSMM_F32) && !defined(OPENCL_LIBSMM_F32_OFF) -# define OPENCL_LIBSMM_F32 -#endif -#if !defined(OPENCL_LIBSMM_F64) && !defined(OPENCL_LIBSMM_F64_OFF) -# define OPENCL_LIBSMM_F64 -#endif -#if !defined(OPENCL_LIBSMM_PFORMAT) && 1 -# define OPENCL_LIBSMM_PFORMAT 8 -#endif - - -#if defined(__cplusplus) -extern "C" { -#endif - -/** Type for querying transpose kernel configuration. */ -typedef struct opencl_libsmm_transkey_t { - libsmm_acc_data_t type; /* must be the 1st data member */ - int m, n; -} opencl_libsmm_transkey_t; - -/** Type for transpose kernel configuration. */ -typedef struct opencl_libsmm_trans_t { - cl_kernel kernel; /* must be the 1st data member */ - size_t wgsize; -} opencl_libsmm_trans_t; - -/** Type for querying SMM-kernel configuration. */ -typedef struct opencl_libsmm_smmkey_t { - libsmm_acc_data_t type; /* must be the 1st data member */ - int m, n, k; - /* device matching configuration (parameters) */ - unsigned int devuid; -} opencl_libsmm_smmkey_t; - -/** Type for SMM-kernel configuration. */ -typedef struct opencl_libsmm_smm_t { - cl_kernel kernel[2]; /* must be the 1st data member */ - size_t wgsize[2]; - double gflops; - /* (pseudo-)parameters (either pretuned or determined) */ - int s, bs, bm, bn, bk, ws, wg, lu, nz, al, tb, tc, ap, aa, ab, ac, flags; -} opencl_libsmm_smm_t; - -/** Type to collect statistics about tuned SMM-kernels */ -typedef struct opencl_libsmm_perfest_t { - double gf_ai_sratio_max, gf_ai_sratio_sumlog, gf_ai_sratio_kahan; - double gf_ai_dratio_max, gf_ai_dratio_sumlog, gf_ai_dratio_kahan; - size_t scount, dcount; -} opencl_libsmm_perfest_t; - - -/** Returns environment variable's value for given domain and key. */ -const char* opencl_libsmm_getenv(const char domain[], const char key[]); - -/** - * TRANS-kernel: write key and tunables into a (file-)stream. - * If config=NULL, key/parameter names are written. The arguments - * delim, begin, and close are optional as well (can be NULL). - * With only the key being written the config still controls - * if values or names are written. - * Returns the number of characters written (negative if error). - */ -int opencl_libsmm_write_trans_params(FILE* stream, int only_key, const opencl_libsmm_transkey_t* key, - const opencl_libsmm_trans_t* config, const char* delim, const char* begin, const char* close); - -/** - * SMM-kernel: write key and tunables into a (file-)stream. - * The environment variable OPENCL_LIBSMM_SMM_PARAMS="" - * reproduces a configuration. If config=NULL, key/parameter - * names are written. The arguments delim, begin, and close - * are optional as well (can be NULL). - * With only the key being written the config still controls - * if values or names are written. - * Returns the number of characters written (negative if error). - */ -int opencl_libsmm_write_smm_params(FILE* stream, int only_key, const opencl_libsmm_smmkey_t* key, const opencl_libsmm_smm_t* config, - const char* delim, const char* begin, const char* close); - -/** Tokenize parambuf and initialize key/value pair. */ -int opencl_libsmm_read_smm_params(char* parambuf, opencl_libsmm_smmkey_t* key, opencl_libsmm_smm_t* value, - opencl_libsmm_perfest_t* perfest, char* device, int* key_ok); - -c_dbcsr_acc_bool_t libsmm_acc_process_suitable( - c_dbcsr_acc_bool_t def_mnk, libsmm_acc_data_t datatype, int stack_size, int m_max, int n_max, int k_max, int max_kernel_dim); - -#if defined(OPENCL_LIBSMM_PFORMAT) && (0 < OPENCL_LIBSMM_PFORMAT) -typedef int (*opencl_libsmm_acc_dbm_launch_fn_t)(void* stream, double alpha, int ntasks, int param_format, const int* params_host, - const int* params, const double* pack_a_data, const double* pack_b_data, double* shard_c_data); -/** Enables DBM-kernel for LIBSMM (revsere reuse). */ -void opencl_libsmm_acc_set_dbm_launch_fn(opencl_libsmm_acc_dbm_launch_fn_t launch_fn); - -/** Backend-specific variant of libsmm_acc_process, which allows to easier reuse LIBSMM kernels. */ -int opencl_libsmm_acc_process(const int* host_param_stack, const int* dev_param_stack, int stack_size, libsmm_acc_data_t datatype, - const void* dev_a_data, const void* dev_b_data, void* dev_c_data, int m_max, int n_max, int k_max, int max_kernel_dim, - c_dbcsr_acc_bool_t def_mnk, void* stream, void* c_stream, int param_format, cl_event* event); -#endif - -#if defined(__cplusplus) -} -#endif - -#endif /*OPENCL_LIBSMM_H*/ diff --git a/src/acc/opencl/smm/opencl_test.sh b/src/acc/opencl/smm/opencl_test.sh deleted file mode 100755 index e8fd8ccea8a..00000000000 --- a/src/acc/opencl/smm/opencl_test.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env bash -#################################################################################################### -# Copyright (C) by the DBCSR developers group - All rights reserved # -# This file is part of the DBCSR library. # -# # -# For information on the license, see the LICENSE file. # -# For further information please visit https://dbcsr.cp2k.org # -# SPDX-License-Identifier: BSD-3-Clause # -#################################################################################################### - -HERE="$(cd "$(dirname "$0")" && pwd -P)" -TEST=acc_bench -EXE=${HERE}/../../${TEST} - -if [ ! -e "$1" ]; then - >&2 echo "USAGE: $0 logfile" - exit 1 -fi -if [ ! -e "${EXE}" ]; then - >&2 echo "ERROR: please build ${TEST}!" - exit 1 -fi - -sed -n "s/FAILED\[..*\] \(..*\): \(..*\)/\1 \2/p" "$1" | while read -r LINE; do - read -r MNK KEYVALS <<<"${LINE}" - EXPORT="" - for KEYVAL in ${KEYVALS}; do - EXPORT="${EXPORT} OPENCL_LIBSMM_SMM_${KEYVAL}" - done - if [ "${EXPORT}" ]; then - echo "${MNK}: ${KEYVALS}" - eval "${EXPORT} ${EXE} ${MNK} 2>&1" | sed "s/^/ /" - fi -done diff --git a/src/acc/opencl/smm/params/README.md b/src/acc/opencl/smm/params/README.md deleted file mode 100644 index f26960f10ee..00000000000 --- a/src/acc/opencl/smm/params/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# Tuned Parameters - -The OpenCL based implementation of LIBSMM supports default kernel-parameters, i.e., kernels can be successfuly generated for every requested multiplication/matrix shape (M, N, K) within the definition of a "Small Matrix Multiplication" (maximum M, N, and K). - -Tuned parameters targeting different devices can co-exist and can be embeded into the same executable, i.e., the executable does not depend on a particular build-path or location of parameter-files. - -Parameters are selected by matching against a device-ID with fallback to the "best-matching" parameters. The device-ID can be based on a vendor-specific function to identify a certain device or is generated from device's name as exposed by the OpenCL API. - -Parameters can be loaded from a CSV-file at runtime (`OPENCL_LIBSMM_SMM_PARAMS` environment variable) and thereby disable matching devices, i.e., parameters loaded this way will take precedence. diff --git a/src/acc/opencl/smm/params/tune_multiply_A100.csv b/src/acc/opencl/smm/params/tune_multiply_A100.csv deleted file mode 100644 index 20d29a9e207..00000000000 --- a/src/acc/opencl/smm/params/tune_multiply_A100.csv +++ /dev/null @@ -1,312 +0,0 @@ -DEVICE;TYPEID;M;N;K;S;GFLOPS;BS;BM;BN;BK;WS;WG;LU;NZ;AL;TB;TC;AP;AA;AB;AC -NVIDIA A100 80GB PCIe [0x1f79];3;2;2;2;30000;0;9;2;1;2;0;1;-1;0;0;0;1;0;2;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;3;3;3;30000;0;9;3;1;3;1;-1;-2;0;0;0;1;0;2;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;4;4;4;30000;0;9;1;1;2;1;-1;-2;0;1;0;1;0;2;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;4;4;5;30000;0;6;1;1;4;0;1;-1;1;0;0;1;1;2;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;4;4;7;30000;0;7;4;1;2;1;1;-2;0;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;4;4;9;30000;0;5;4;1;2;1;-1;0;0;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;4;4;10;30000;0;6;4;1;4;0;0;-1;1;1;1;1;0;1;2;1;0 -NVIDIA A100 80GB PCIe [0x1f79];3;4;4;13;30000;0;4;1;1;4;1;-1;0;0;0;0;1;0;2;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;4;4;15;30000;0;14;4;1;2;0;-2;-1;1;0;1;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;4;4;17;30000;0;5;4;1;4;0;-2;-1;1;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;4;4;25;30000;0;14;4;1;2;0;0;1;0;0;0;1;1;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;4;4;26;30000;0;14;4;1;3;0;-2;-1;1;0;1;1;1;1;0;1;0 -NVIDIA A100 80GB PCIe [0x1f79];3;4;4;28;30000;0;6;4;1;2;0;-1;-1;0;1;0;1;1;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;4;4;32;30000;0;3;4;1;4;0;1;-1;0;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;4;5;4;30000;0;12;4;1;4;1;1;-1;0;0;0;1;0;0;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;4;5;5;30000;0;9;1;1;1;0;-1;1;1;1;0;1;0;0;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;4;5;7;30000;0;6;4;1;2;1;1;0;0;1;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;4;5;9;30000;0;6;4;1;2;1;0;-2;0;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;4;5;13;30000;0;4;4;1;4;0;-1;-2;1;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;4;5;17;30000;0;5;4;1;2;0;1;-1;0;0;0;1;1;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;4;5;25;30000;0;6;4;1;3;0;-1;-1;0;0;1;0;0;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;4;5;32;30000;0;2;1;1;2;1;-2;1;0;0;0;1;0;0;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;4;7;4;30000;0;24;4;1;3;1;0;0;0;0;0;1;0;2;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;4;7;5;30000;0;14;4;1;2;1;1;-2;0;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;4;7;7;30000;0;10;4;1;1;0;-1;-1;0;1;1;1;1;0;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;4;7;9;30000;0;6;4;1;3;0;-2;0;0;1;0;1;0;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;4;7;13;30000;0;4;4;1;3;0;1;-2;1;0;0;1;0;1;0;1;0 -NVIDIA A100 80GB PCIe [0x1f79];3;4;9;4;30000;0;15;4;1;4;0;0;-2;0;0;0;1;1;2;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;4;9;5;30000;0;10;4;1;2;1;0;-1;0;1;0;1;0;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;4;9;7;30000;0;14;4;1;4;0;0;-1;0;0;0;1;0;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;4;9;9;30000;0;10;4;1;4;0;1;-2;0;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;4;9;13;30000;0;5;4;1;4;0;0;0;0;0;0;1;1;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;4;10;4;30000;0;24;4;1;4;1;-2;-1;0;1;0;1;0;2;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;4;10;10;30000;0;14;4;1;4;1;0;0;0;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;4;13;4;30000;0;12;2;1;3;0;1;0;0;1;0;1;0;0;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;4;13;5;30000;0;16;2;2;4;0;-2;-1;0;1;1;1;0;0;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;4;13;7;30000;0;14;4;1;1;0;2;0;0;0;0;1;0;2;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;4;13;9;30000;0;7;4;1;3;0;1;-2;1;1;0;1;1;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;4;13;13;30000;0;10;4;1;3;0;-2;-2;0;0;0;1;1;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;4;13;17;30000;0;10;4;1;2;0;-2;1;0;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;4;13;32;30000;0;15;4;1;4;0;-1;-2;0;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;4;15;4;30000;0;20;4;1;1;0;0;0;0;0;1;1;0;0;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;4;17;4;30000;0;22;4;1;2;0;-1;-1;1;0;0;1;0;0;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;4;17;5;30000;0;12;4;1;3;0;1;-2;1;0;0;1;0;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;4;17;13;30000;0;10;4;1;4;0;0;-2;0;0;0;1;0;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;4;17;17;30000;0;10;4;1;3;0;-1;-2;0;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;4;17;32;30000;0;15;4;1;3;0;1;0;0;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;4;25;4;30000;0;23;4;1;1;0;0;0;0;0;0;1;1;0;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;4;25;5;30000;0;21;4;1;2;0;0;0;0;0;1;1;0;2;2;1;0 -NVIDIA A100 80GB PCIe [0x1f79];3;4;26;4;30000;0;22;4;1;1;0;-2;0;1;0;1;1;0;0;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;4;28;4;30000;0;18;4;1;1;0;-2;0;0;1;1;1;0;2;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;4;32;4;30000;0;19;4;1;1;0;0;-2;1;0;0;1;0;2;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;4;32;5;30000;0;19;4;1;2;1;1;-2;0;1;0;1;0;0;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;4;32;13;30000;0;12;4;1;3;0;1;-1;0;0;0;1;1;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;4;32;17;30000;0;13;4;1;3;0;1;1;0;0;0;1;1;1;2;1;0 -NVIDIA A100 80GB PCIe [0x1f79];3;4;32;32;30000;0;25;4;1;4;0;1;-1;0;1;0;1;1;1;2;1;0 -NVIDIA A100 80GB PCIe [0x1f79];3;5;4;4;30000;0;9;1;1;5;1;0;-1;0;1;1;1;0;0;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;5;4;5;30000;0;12;1;1;3;1;0;-2;0;1;0;1;0;0;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;5;4;7;30000;0;15;1;1;1;0;-2;0;0;0;0;1;0;2;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;5;4;9;30000;0;12;1;1;5;1;0;0;0;0;0;1;0;2;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;5;4;13;30000;0;10;1;1;2;0;0;-1;0;1;0;0;0;2;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;5;4;17;30000;0;4;1;1;1;1;0;-2;0;1;0;1;0;0;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;5;4;25;30000;0;5;5;1;4;0;1;-2;0;0;0;0;0;2;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;5;4;32;30000;0;2;1;1;2;1;0;0;0;0;0;1;0;2;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;5;5;4;30000;0;10;1;1;2;1;0;0;1;1;0;1;0;2;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;5;5;5;30000;0;18;5;1;2;1;1;-1;0;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;5;5;7;30000;0;7;5;1;5;1;-1;-2;0;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;5;5;9;30000;0;25;5;1;5;0;1;-2;0;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;5;5;13;30000;0;10;1;1;2;1;0;-1;0;0;0;1;0;0;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;5;5;17;30000;0;4;1;1;3;1;0;1;0;0;0;1;0;2;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;5;5;32;30000;0;5;5;1;2;0;-2;-1;0;0;0;1;1;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;5;7;4;30000;0;12;5;1;2;1;1;0;0;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;5;7;5;30000;0;14;5;1;2;1;1;-2;0;1;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;5;7;7;30000;0;14;5;1;4;0;-2;0;1;0;1;1;0;2;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;5;7;9;30000;0;16;5;1;4;0;-1;-1;1;0;1;1;0;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;5;7;13;30000;0;12;5;1;5;0;-1;-2;1;0;0;1;1;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;5;9;4;30000;0;18;5;1;4;1;0;-2;0;0;0;1;0;2;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;5;9;5;30000;0;24;5;1;3;0;1;-2;0;0;1;1;0;2;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;5;9;7;30000;0;15;5;1;2;0;1;-1;0;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;5;9;9;30000;0;12;5;1;1;0;1;0;1;1;1;1;0;0;0;1;0 -NVIDIA A100 80GB PCIe [0x1f79];3;5;13;4;30000;0;12;5;1;4;0;0;0;0;0;0;1;0;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;5;13;5;30000;0;14;5;1;3;0;-1;0;1;0;1;1;1;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;5;13;7;30000;0;24;5;1;2;0;1;0;1;0;0;1;1;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;5;13;13;30000;0;10;5;1;2;0;-1;0;0;0;0;1;1;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;5;13;17;30000;0;10;5;1;4;0;-2;-1;1;0;0;1;0;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;5;13;32;30000;0;15;5;1;4;0;-2;-1;0;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;5;17;4;30000;0;22;5;1;5;0;-1;0;0;0;0;1;1;0;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;5;17;5;30000;0;12;5;1;4;0;-2;0;1;0;0;1;0;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;5;17;13;30000;0;10;5;1;3;0;0;-1;1;0;1;1;1;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;5;17;17;30000;0;10;5;1;5;0;1;-1;0;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;5;17;32;30000;0;15;5;1;4;0;1;0;0;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;5;25;4;30000;0;29;5;1;1;0;1;-2;0;0;0;1;1;0;0;1;0 -NVIDIA A100 80GB PCIe [0x1f79];3;5;32;4;30000;0;24;5;1;5;0;-2;-1;1;0;1;1;0;0;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;5;32;5;30000;0;20;5;1;5;0;-1;-1;0;0;1;1;1;0;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;5;32;13;30000;0;13;5;1;5;0;1;-1;0;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;5;32;17;30000;0;10;5;1;2;0;1;0;0;0;0;1;1;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;5;32;32;30000;0;15;5;1;2;0;-1;0;1;0;0;1;1;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;6;6;6;30000;0;10;6;1;2;1;-2;0;0;1;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;6;6;7;30000;0;19;6;1;6;0;-2;-1;1;1;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;6;6;8;30000;0;10;6;1;2;0;1;1;0;0;1;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;6;7;6;30000;0;28;6;1;5;0;-2;0;1;0;0;1;1;2;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;6;7;7;30000;0;11;6;1;2;0;1;-1;1;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;6;7;8;30000;0;14;6;1;4;0;-1;0;1;0;0;1;0;1;2;1;0 -NVIDIA A100 80GB PCIe [0x1f79];3;6;8;6;30000;0;14;6;1;3;0;0;0;0;0;0;1;1;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;6;8;7;30000;0;12;6;1;4;0;-1;-1;0;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;6;8;8;30000;0;26;6;1;4;0;0;-1;0;1;1;1;1;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;7;4;4;30000;0;9;1;1;3;1;-2;0;1;0;0;1;0;0;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;7;4;5;30000;0;10;1;1;2;0;-2;-2;0;0;1;1;0;2;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;7;4;7;30000;0;9;1;1;5;0;-1;-1;0;0;0;1;0;0;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;7;4;9;30000;0;6;1;1;5;0;0;-2;0;0;0;1;0;0;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;7;4;13;30000;0;19;7;1;2;0;-1;-2;0;1;1;1;0;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;7;5;4;30000;0;16;7;1;3;1;1;0;0;1;0;1;0;0;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;7;5;5;30000;0;10;7;1;2;1;-1;1;0;0;0;1;0;0;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;7;5;7;30000;0;14;7;1;2;0;-2;0;0;0;1;1;1;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;7;5;9;30000;0;10;7;1;4;0;1;0;0;1;1;1;0;0;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;7;5;13;30000;0;10;1;2;3;0;1;-2;1;0;1;1;0;2;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;7;6;6;30000;0;14;7;1;7;0;0;-1;0;0;0;1;1;0;0;1;0 -NVIDIA A100 80GB PCIe [0x1f79];3;7;6;7;30000;0;14;2;1;3;0;1;-2;1;0;1;1;1;0;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;7;6;8;30000;0;20;7;1;2;0;0;-1;0;1;1;1;1;0;2;1;0 -NVIDIA A100 80GB PCIe [0x1f79];3;7;7;4;30000;0;24;7;1;2;1;0;-2;0;1;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;7;7;5;30000;0;13;7;1;6;0;-2;0;0;0;0;1;1;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;7;7;6;30000;0;35;7;1;3;0;0;1;1;0;1;1;0;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;7;7;7;30000;0;18;7;1;2;0;2;0;0;0;1;1;0;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;7;7;8;30000;0;21;7;1;3;0;-2;1;0;0;0;1;0;1;2;1;0 -NVIDIA A100 80GB PCIe [0x1f79];3;7;7;9;30000;0;7;7;1;4;0;-2;-1;0;0;1;1;0;1;1;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;7;7;13;30000;0;20;7;1;2;0;1;0;1;0;1;1;1;1;1;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;7;8;6;30000;0;19;7;1;3;0;1;-1;0;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;7;8;7;30000;0;12;7;1;4;0;0;-2;0;1;0;1;1;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;7;8;8;30000;0;10;7;1;6;0;1;-1;0;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;7;9;4;30000;0;16;7;1;2;0;-2;0;0;0;1;1;1;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;7;9;5;30000;0;13;7;1;3;0;0;-2;1;0;0;1;0;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;7;9;7;30000;0;12;7;1;4;0;0;0;0;0;0;1;1;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;7;13;4;30000;0;21;7;1;6;0;0;-2;0;0;1;1;0;0;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;7;13;5;30000;0;9;7;1;4;0;1;0;1;0;1;1;1;1;1;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;7;13;7;30000;0;22;7;1;2;0;0;0;1;0;1;1;0;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;7;13;13;30000;0;5;1;2;3;0;0;-2;1;1;1;1;0;2;0;1;0 -NVIDIA A100 80GB PCIe [0x1f79];3;8;6;6;30000;0;12;1;2;8;1;-1;0;0;0;0;1;0;2;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;8;6;7;30000;0;13;8;1;8;0;-2;-1;0;0;0;1;0;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;8;6;8;30000;0;18;8;1;8;0;1;1;0;0;0;1;0;0;2;1;0 -NVIDIA A100 80GB PCIe [0x1f79];3;8;7;6;30000;0;15;8;1;2;0;0;-1;0;1;0;1;0;2;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;8;7;7;30000;0;10;2;1;2;0;-2;0;0;0;0;1;0;0;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;8;7;8;30000;0;12;2;1;6;0;-1;-1;1;0;1;1;0;2;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;8;8;6;30000;0;18;8;1;2;0;-2;-1;1;0;0;1;0;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;8;8;7;30000;0;14;8;1;3;0;0;-2;0;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;8;8;8;30000;0;12;8;1;5;0;0;-1;0;0;1;1;1;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;9;4;4;30000;0;14;9;1;4;1;-1;-2;0;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;9;4;5;30000;0;14;9;1;4;1;1;0;0;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;9;4;7;30000;0;9;2;1;4;1;1;1;0;0;0;1;0;2;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;9;4;9;30000;0;9;1;2;8;1;0;-2;0;1;0;1;0;2;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;9;4;13;30000;0;10;9;1;2;0;1;0;0;0;1;1;0;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;9;5;4;30000;0;14;9;1;7;1;-2;-2;0;0;0;1;0;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;9;5;5;30000;0;12;2;1;3;1;0;0;0;0;0;1;0;2;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;9;5;7;30000;0;18;9;1;4;0;-2;-1;0;0;0;1;0;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;9;5;9;30000;0;14;2;1;3;0;0;-2;0;0;0;1;1;0;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;9;7;4;30000;0;18;9;1;3;0;-1;0;1;0;1;1;1;1;2;1;0 -NVIDIA A100 80GB PCIe [0x1f79];3;9;7;5;30000;0;18;9;1;3;0;0;-2;0;0;1;1;1;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;9;7;7;30000;0;10;9;1;3;0;1;-1;0;0;0;1;0;1;2;1;0 -NVIDIA A100 80GB PCIe [0x1f79];3;9;9;4;30000;0;24;9;1;7;0;-2;0;0;0;1;1;1;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;9;9;5;30000;0;15;9;1;2;0;0;-2;1;0;1;1;1;0;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;9;9;9;30000;0;14;9;1;9;0;1;-1;0;1;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;9;9;16;30000;0;10;9;1;6;0;1;-1;1;1;1;1;0;1;2;1;0 -NVIDIA A100 80GB PCIe [0x1f79];3;9;9;22;30000;0;10;9;1;2;0;-2;1;0;1;1;1;0;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;9;9;32;30000;0;12;9;1;3;0;-1;-1;0;1;0;1;0;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;9;13;4;30000;0;17;9;1;3;0;-1;0;1;0;0;1;1;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;9;16;9;30000;0;12;9;1;2;1;-1;-2;0;1;0;1;0;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;9;16;16;30000;0;2;1;8;8;0;-2;-1;0;0;0;0;0;2;1;1;0 -NVIDIA A100 80GB PCIe [0x1f79];3;9;16;22;30000;0;8;9;1;2;0;-1;0;0;1;0;1;1;1;1;1;0 -NVIDIA A100 80GB PCIe [0x1f79];3;9;22;9;30000;0;15;9;1;2;0;1;-2;1;0;0;1;1;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;9;22;16;30000;0;10;9;1;5;0;-2;-2;1;0;0;1;0;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;9;22;22;30000;0;10;9;1;5;0;-1;-1;1;0;0;1;0;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;9;22;32;30000;0;15;9;1;5;0;1;-2;1;1;0;1;1;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;9;32;9;30000;0;13;9;1;4;0;1;-1;1;1;0;1;1;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;9;32;22;30000;0;12;9;1;7;0;-1;-2;1;1;1;1;0;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;9;32;32;30000;0;12;9;1;9;0;-1;-2;1;1;1;1;0;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;10;4;4;30000;0;12;1;2;4;0;-2;-1;0;0;0;1;0;2;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;10;4;10;30000;0;10;1;2;6;0;0;-2;0;0;1;1;1;0;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;10;10;4;30000;0;24;10;1;5;0;1;1;0;0;0;1;1;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;10;10;10;30000;0;3;10;1;3;0;-2;-1;1;0;0;1;1;1;2;1;0 -NVIDIA A100 80GB PCIe [0x1f79];3;13;4;4;30000;0;16;1;2;5;0;1;1;0;0;0;1;1;0;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;13;4;5;30000;0;9;13;1;9;0;-1;0;1;0;1;1;1;0;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;13;4;7;30000;0;10;2;1;10;1;1;0;0;0;0;1;0;0;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;13;4;9;30000;0;9;2;1;2;0;0;-1;1;0;1;1;0;0;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;13;4;13;30000;0;12;13;1;12;0;0;-2;0;0;0;1;1;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;13;4;17;30000;0;10;13;1;1;0;-1;-2;0;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;13;4;32;30000;0;15;13;1;2;0;-1;-1;1;0;0;1;1;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;13;5;4;30000;0;9;1;3;13;1;-1;-1;0;1;0;1;0;2;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;13;5;5;30000;0;14;3;1;8;1;0;1;0;0;0;1;0;0;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;13;5;7;30000;0;4;13;1;12;0;1;-1;1;1;1;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;13;5;13;30000;0;10;3;1;9;0;-1;-1;0;0;1;1;0;0;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;13;5;17;30000;0;14;2;2;5;0;-1;0;0;1;0;1;0;0;1;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;13;5;32;30000;0;40;2;2;7;0;-1;0;0;1;0;1;0;0;2;1;0 -NVIDIA A100 80GB PCIe [0x1f79];3;13;7;4;30000;0;14;13;1;10;0;1;-2;0;0;1;1;0;1;1;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;13;7;5;30000;0;18;13;1;4;0;-1;0;1;1;1;1;1;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;13;7;7;30000;0;17;13;1;3;0;-2;1;1;1;1;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;13;7;13;30000;0;10;1;4;4;0;-1;-2;1;0;1;1;0;2;1;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;13;9;4;30000;0;18;13;1;12;0;-1;0;1;0;1;1;1;1;2;1;0 -NVIDIA A100 80GB PCIe [0x1f79];3;13;13;4;30000;0;18;13;1;12;0;0;-2;1;0;1;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;13;13;5;30000;0;24;13;1;3;0;0;0;1;0;0;1;0;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;13;13;7;30000;0;20;13;1;8;0;0;0;1;0;1;1;1;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;13;13;13;30000;0;9;13;1;4;0;-2;1;1;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;13;13;17;30000;0;7;13;1;12;0;1;-1;0;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;13;13;32;30000;0;9;13;1;13;0;0;0;0;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;13;17;4;30000;0;18;13;1;11;0;-2;-1;0;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;13;17;5;30000;0;19;13;1;13;0;-1;-1;1;0;0;1;1;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;13;17;13;30000;0;15;13;1;9;0;-2;0;0;0;0;1;1;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;13;17;17;30000;0;15;13;1;5;0;1;-2;0;0;1;1;1;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;13;17;32;30000;0;26;13;1;11;0;-2;0;1;0;0;1;1;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;13;32;4;30000;0;26;13;1;8;0;-2;-1;1;0;0;1;1;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;13;32;5;30000;0;18;13;1;4;0;-1;0;0;0;0;1;1;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;13;32;13;30000;0;20;13;1;13;0;1;-1;0;0;0;1;1;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;13;32;17;30000;0;26;13;1;9;0;-1;-1;0;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;13;32;32;30000;0;12;13;1;13;1;-1;0;1;0;0;1;0;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;15;4;4;30000;0;9;2;1;2;1;-1;-2;0;0;0;1;0;0;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;15;15;15;30000;0;15;15;1;2;0;-1;0;1;0;0;1;1;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;16;9;9;30000;0;10;16;1;8;0;0;0;1;1;1;1;0;1;1;1;0 -NVIDIA A100 80GB PCIe [0x1f79];3;16;9;16;30000;0;10;16;1;4;0;0;0;0;0;0;1;0;1;0;1;0 -NVIDIA A100 80GB PCIe [0x1f79];3;16;9;22;30000;0;20;16;1;7;0;0;-1;0;0;0;1;1;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;16;16;9;30000;0;15;16;1;2;0;0;0;1;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;16;16;16;30000;0;12;16;1;2;0;-1;-1;1;0;0;1;1;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;16;16;22;30000;0;11;16;1;14;0;1;-1;1;1;0;1;1;1;0;1;0 -NVIDIA A100 80GB PCIe [0x1f79];3;16;22;9;30000;0;13;16;1;14;0;1;0;1;0;0;1;1;1;2;1;0 -NVIDIA A100 80GB PCIe [0x1f79];3;16;22;16;30000;0;23;16;1;3;0;-2;-2;1;0;0;1;1;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;16;22;22;30000;0;31;16;1;7;0;-1;-1;1;0;1;1;1;1;0;1;0 -NVIDIA A100 80GB PCIe [0x1f79];3;17;4;4;30000;0;10;17;1;15;0;-2;0;1;0;0;1;0;0;0;1;0 -NVIDIA A100 80GB PCIe [0x1f79];3;17;4;5;30000;0;9;2;2;9;0;-1;-1;1;1;0;1;0;2;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;17;4;13;30000;0;9;3;1;15;0;-2;-1;0;1;0;1;1;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;17;4;17;30000;0;10;17;1;3;0;1;1;0;0;0;1;1;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;17;4;32;30000;0;7;17;1;1;0;1;-2;1;0;0;1;1;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;17;5;4;30000;0;14;3;1;3;0;0;-2;0;0;0;1;0;0;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;17;5;5;30000;0;24;17;1;11;0;-1;0;0;0;0;1;0;0;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;17;5;13;30000;0;10;1;5;13;0;-1;-2;0;1;1;1;1;2;1;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;17;5;17;30000;0;10;17;1;17;0;-1;0;0;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;17;5;32;30000;0;4;17;1;17;0;-2;-2;0;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;17;13;4;30000;0;19;9;1;5;0;0;-1;0;0;0;1;0;0;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;17;13;5;30000;0;14;17;1;16;0;-2;-2;0;0;0;1;1;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;17;13;13;30000;0;12;17;1;17;0;0;0;0;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;17;13;17;30000;0;8;17;1;1;0;-2;-2;1;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;17;13;32;30000;0;26;17;1;4;0;-1;-2;0;0;0;1;1;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;17;17;4;30000;0;24;17;1;14;0;0;-2;0;1;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;17;17;5;30000;0;18;17;1;15;0;0;-1;0;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;17;17;13;30000;0;15;17;1;9;0;0;-2;0;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;17;17;17;30000;0;24;17;1;17;0;0;0;0;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;17;17;32;30000;0;7;17;1;16;0;0;-1;0;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;17;32;4;30000;0;18;17;1;6;0;-2;-2;1;1;0;1;1;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;17;32;5;30000;0;18;17;1;17;0;-1;-2;1;1;0;1;1;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;17;32;13;30000;0;20;17;1;10;0;-1;0;1;0;1;1;1;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;17;32;17;30000;0;20;17;1;14;0;1;0;0;0;0;1;0;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;17;32;32;30000;0;24;17;1;2;1;0;-2;1;1;0;1;1;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;20;20;20;30000;0;24;20;1;17;0;1;-1;0;0;1;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;22;9;9;30000;0;18;22;1;11;0;1;-1;0;1;1;1;1;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;22;9;16;30000;0;18;22;1;6;0;-1;-1;1;1;1;1;0;1;1;1;0 -NVIDIA A100 80GB PCIe [0x1f79];3;22;9;22;30000;0;7;22;1;3;0;-1;-2;0;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;22;9;32;30000;0;1;22;1;14;0;-2;-2;1;1;0;1;0;2;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;22;16;9;30000;0;13;22;1;10;0;1;0;0;1;1;1;1;1;1;1;0 -NVIDIA A100 80GB PCIe [0x1f79];3;22;16;16;30000;0;7;22;1;3;0;1;-1;1;1;0;1;0;1;0;1;0 -NVIDIA A100 80GB PCIe [0x1f79];3;22;16;22;30000;0;24;22;1;9;0;1;0;1;1;0;1;1;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;22;22;9;30000;0;24;22;1;5;0;0;0;1;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;22;22;16;30000;0;15;22;1;15;0;-1;0;1;0;0;1;1;1;0;1;0 -NVIDIA A100 80GB PCIe [0x1f79];3;22;22;22;30000;0;24;22;1;22;0;0;-2;1;0;1;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;22;22;32;30000;0;24;22;1;13;1;0;-2;0;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;22;32;9;30000;0;15;22;1;9;0;-1;1;1;1;0;1;0;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;22;32;22;30000;0;24;22;1;19;0;0;-2;1;0;1;1;1;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;22;32;32;30000;0;24;22;1;15;1;-2;-2;0;1;1;1;1;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;23;23;23;30000;0;24;23;1;15;1;0;-2;0;0;0;1;0;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;24;24;24;30000;0;18;24;1;17;1;-1;2;1;1;0;1;1;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;25;4;4;30000;0;19;25;1;10;0;1;1;0;0;1;1;0;1;1;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;25;4;5;30000;0;1;25;1;15;0;0;1;0;1;0;0;1;2;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;25;5;4;30000;0;5;25;1;14;0;-2;0;0;1;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;25;25;25;30000;0;24;25;1;13;1;1;-2;1;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;26;4;4;30000;0;18;26;1;3;0;0;-2;0;0;0;1;1;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;28;4;4;30000;0;14;28;1;16;1;1;4;0;0;0;1;0;2;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;28;28;28;30000;0;25;28;1;3;1;1;-2;1;0;1;1;1;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;30;30;30;30000;0;41;30;1;16;1;-2;-2;1;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;32;4;4;30000;0;19;2;2;32;0;-1;-1;0;1;0;1;0;0;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;32;4;5;30000;0;10;1;4;26;0;1;0;0;0;0;1;1;2;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;32;4;13;30000;0;9;32;1;5;0;-2;0;0;0;0;1;1;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;32;4;17;30000;0;13;32;1;22;0;-2;0;1;0;1;1;1;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;32;4;32;30000;0;24;4;1;6;0;-2;1;1;0;1;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;32;5;4;30000;0;34;2;2;13;0;0;0;1;1;1;1;0;0;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;32;5;5;30000;0;20;1;5;14;0;1;0;1;1;1;1;0;2;0;1;0 -NVIDIA A100 80GB PCIe [0x1f79];3;32;5;13;30000;0;10;1;5;19;0;-2;-1;0;0;1;1;1;0;1;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;32;5;17;30000;0;20;32;1;20;0;-1;1;0;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;32;5;32;30000;0;30;32;1;7;0;1;0;0;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;32;9;9;30000;0;24;3;5;26;0;-1;0;0;1;0;1;1;2;2;1;0 -NVIDIA A100 80GB PCIe [0x1f79];3;32;9;22;30000;0;25;3;6;23;0;-2;0;0;0;1;1;1;2;1;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;32;9;32;30000;0;11;5;1;4;0;0;-1;1;1;0;1;1;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;32;13;4;30000;0;18;32;1;30;0;0;-1;1;0;0;1;1;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;32;13;5;30000;0;13;1;13;32;0;0;1;0;1;0;1;1;0;1;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;32;13;13;30000;0;6;1;7;31;0;-1;-1;1;0;1;1;0;2;1;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;32;13;17;30000;0;8;32;1;25;0;-2;0;1;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;32;13;32;30000;0;35;32;1;4;1;-1;4;0;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;32;17;4;30000;0;24;32;1;13;0;1;1;0;0;1;1;1;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;32;17;5;30000;0;18;32;1;10;0;-1;-2;1;0;0;1;1;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;32;17;13;30000;0;25;32;1;27;0;-2;0;1;0;1;1;1;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;32;17;17;30000;0;25;32;1;11;0;0;0;0;0;0;1;1;1;2;1;0 -NVIDIA A100 80GB PCIe [0x1f79];3;32;17;32;30000;0;8;32;1;32;1;0;0;1;0;1;1;1;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;32;22;9;30000;0;28;32;1;11;0;-1;1;1;1;0;1;1;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;32;22;22;30000;0;36;32;1;7;1;-1;-1;0;0;0;1;1;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;32;22;32;30000;0;28;32;1;31;1;-2;4;1;0;1;1;1;1;1;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;32;32;4;30000;0;38;32;1;17;0;1;0;1;0;1;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;32;32;5;30000;0;26;32;1;22;0;1;-2;1;0;1;1;0;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;32;32;9;30000;0;41;32;1;2;0;0;0;1;0;1;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;32;32;13;30000;0;40;32;1;6;1;0;-2;1;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;32;32;17;30000;0;24;32;1;16;1;-2;0;1;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;32;32;22;30000;0;24;32;1;8;1;0;-2;1;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;32;32;32;30000;0;24;32;1;30;1;0;-2;0;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;35;35;35;30000;0;10;35;1;35;1;0;0;1;0;0;1;1;1;2;1;0 -NVIDIA A100 80GB PCIe [0x1f79];3;36;36;36;30000;0;41;36;1;9;1;-1;4;1;0;1;1;1;1;0;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;40;40;40;30000;0;13;40;1;40;1;1;0;0;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;45;45;45;30000;0;35;45;1;39;45;0;-2;0;0;0;1;0;1;2;0;0 -NVIDIA A100 80GB PCIe [0x1f79];3;64;64;64;30000;0;10;64;1;9;64;1;2;0;1;0;1;0;1;0;0;0 diff --git a/src/acc/opencl/smm/params/tune_multiply_BMG.csv b/src/acc/opencl/smm/params/tune_multiply_BMG.csv deleted file mode 100644 index da905f4546f..00000000000 --- a/src/acc/opencl/smm/params/tune_multiply_BMG.csv +++ /dev/null @@ -1,100 +0,0 @@ -DEVICE;TYPEID;M;N;K;S;GFLOPS;BS;BM;BN;BK;WS;WG;LU;NZ;AL;TB;TC;AP;AA;AB;AC -Intel(R) Graphics [0xe223];3;5;5;5;30000;0;24;5;1;1;5;1;0;0;0;0;1;0;0;0;0;0 -Intel(R) Graphics [0xe223];3;5;5;13;30000;0;30;5;1;1;1;1;-1;0;0;0;1;0;0;0;0;0 -Intel(R) Graphics [0xe223];3;5;5;16;30000;0;15;5;1;1;5;1;-2;0;0;0;1;0;2;2;0;0 -Intel(R) Graphics [0xe223];3;5;5;24;30000;0;17;5;1;1;1;0;1;0;0;0;1;0;2;2;0;0 -Intel(R) Graphics [0xe223];3;5;5;26;30000;0;15;5;1;1;1;0;-1;0;0;0;1;0;2;0;0;0 -Intel(R) Graphics [0xe223];3;5;13;5;30000;0;30;5;1;1;1;-1;0;0;0;0;1;0;0;2;0;0 -Intel(R) Graphics [0xe223];3;5;13;13;30000;0;40;5;1;1;13;-1;-2;0;0;0;1;0;0;0;0;1 -Intel(R) Graphics [0xe223];3;5;13;16;30000;0;30;5;1;1;13;-2;-2;0;0;0;1;0;0;0;0;0 -Intel(R) Graphics [0xe223];3;5;13;24;30000;0;31;5;1;1;13;0;1;0;0;0;1;0;2;2;0;1 -Intel(R) Graphics [0xe223];3;5;13;26;30000;0;24;5;1;4;1;-1;-1;0;0;0;1;0;1;0;0;0 -Intel(R) Graphics [0xe223];3;5;16;5;30000;0;41;5;1;1;1;0;-1;0;0;0;1;0;0;2;0;0 -Intel(R) Graphics [0xe223];3;5;16;13;30000;0;31;5;1;1;16;0;0;0;0;0;1;0;0;2;0;1 -Intel(R) Graphics [0xe223];3;5;16;16;30000;0;30;5;1;1;16;0;-1;0;0;0;1;0;0;0;0;0 -Intel(R) Graphics [0xe223];3;5;16;24;30000;0;24;5;1;1;16;0;0;0;0;0;1;0;0;0;0;0 -Intel(R) Graphics [0xe223];3;5;16;26;30000;0;46;5;1;1;16;-2;-1;0;0;0;1;0;2;2;0;1 -Intel(R) Graphics [0xe223];3;5;24;5;30000;0;30;5;1;1;1;-1;-2;0;0;0;1;0;2;2;0;0 -Intel(R) Graphics [0xe223];3;5;24;13;30000;0;30;5;1;1;1;-2;-1;0;0;0;1;0;2;0;0;0 -Intel(R) Graphics [0xe223];3;5;24;16;30000;0;30;5;1;1;24;-1;1;0;0;0;1;0;0;0;0;0 -Intel(R) Graphics [0xe223];3;5;24;24;30000;0;40;5;1;1;24;0;1;0;0;0;1;0;0;2;0;1 -Intel(R) Graphics [0xe223];3;5;24;26;30000;0;42;5;1;1;24;-1;1;0;0;0;1;0;0;0;0;0 -Intel(R) Graphics [0xe223];3;5;26;5;30000;0;30;5;1;1;1;-1;-2;0;0;0;1;0;0;0;0;0 -Intel(R) Graphics [0xe223];3;5;26;13;30000;0;30;5;1;1;26;1;-2;0;0;0;1;0;0;2;0;1 -Intel(R) Graphics [0xe223];3;5;26;16;30000;0;24;5;1;1;26;-2;-2;0;0;0;1;0;0;0;0;0 -Intel(R) Graphics [0xe223];3;5;26;24;30000;0;30;5;1;4;26;1;1;0;0;0;1;0;1;0;0;1 -Intel(R) Graphics [0xe223];3;5;26;26;30000;0;30;5;1;1;26;1;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Graphics [0xe223];3;6;6;6;30000;0;30;6;1;1;1;-2;0;0;0;0;1;0;0;0;0;0 -Intel(R) Graphics [0xe223];3;9;9;9;30000;0;30;9;1;1;1;0;0;0;0;0;1;0;2;0;0;0 -Intel(R) Graphics [0xe223];3;9;9;16;30000;0;15;9;1;1;9;-1;1;0;0;0;1;0;0;0;0;1 -Intel(R) Graphics [0xe223];3;9;9;22;30000;0;40;9;1;1;9;-2;1;0;0;0;1;0;0;0;0;0 -Intel(R) Graphics [0xe223];3;9;16;9;30000;0;59;9;1;1;16;-1;0;0;0;0;1;0;0;0;0;1 -Intel(R) Graphics [0xe223];3;9;16;16;30000;0;30;9;1;7;16;-1;-1;0;0;0;1;0;0;1;0;1 -Intel(R) Graphics [0xe223];3;9;16;22;30000;0;30;9;1;1;1;-2;-1;0;0;0;1;0;0;0;0;0 -Intel(R) Graphics [0xe223];3;9;22;9;30000;0;30;9;1;1;22;-1;-2;0;0;0;1;0;0;2;0;1 -Intel(R) Graphics [0xe223];3;9;22;16;30000;0;30;9;1;1;22;-1;-1;0;0;0;1;0;2;0;0;1 -Intel(R) Graphics [0xe223];3;9;22;22;30000;0;30;9;1;1;22;0;1;0;0;0;1;0;2;0;0;1 -Intel(R) Graphics [0xe223];3;13;5;5;30000;0;30;13;1;12;13;1;2;0;0;0;1;0;1;1;0;1 -Intel(R) Graphics [0xe223];3;13;5;13;30000;0;20;13;1;11;1;-1;2;0;0;0;1;0;1;0;0;0 -Intel(R) Graphics [0xe223];3;13;5;16;30000;0;30;13;1;3;13;-1;2;0;0;0;1;0;1;1;0;1 -Intel(R) Graphics [0xe223];3;13;5;24;30000;0;24;13;1;2;13;0;2;0;0;0;1;0;1;1;0;0 -Intel(R) Graphics [0xe223];3;13;5;26;30000;0;24;13;1;13;13;0;2;0;0;0;1;0;0;0;0;0 -Intel(R) Graphics [0xe223];3;13;13;5;30000;0;30;13;1;1;13;-2;1;0;0;0;1;0;0;2;0;0 -Intel(R) Graphics [0xe223];3;13;13;13;30000;0;24;13;1;1;1;1;-1;0;0;0;1;0;0;0;0;0 -Intel(R) Graphics [0xe223];3;13;13;16;30000;0;24;13;1;10;13;1;-1;0;0;0;1;0;1;0;0;0 -Intel(R) Graphics [0xe223];3;13;13;24;30000;0;30;13;1;1;13;-2;1;0;0;0;1;0;0;0;0;1 -Intel(R) Graphics [0xe223];3;13;13;26;30000;0;41;13;1;1;13;-1;1;0;0;0;1;0;0;0;0;0 -Intel(R) Graphics [0xe223];3;13;16;5;30000;0;40;13;1;3;16;0;1;0;0;0;1;0;0;0;0;0 -Intel(R) Graphics [0xe223];3;13;16;13;30000;0;30;13;1;12;16;1;1;0;0;0;1;0;2;1;0;0 -Intel(R) Graphics [0xe223];3;13;16;16;30000;0;31;13;1;11;16;-2;-2;0;0;0;1;0;1;0;0;0 -Intel(R) Graphics [0xe223];3;13;16;24;30000;0;31;13;1;7;16;0;0;0;0;0;1;0;1;0;0;0 -Intel(R) Graphics [0xe223];3;13;16;26;30000;0;25;13;1;7;16;-1;-1;0;0;0;1;0;1;2;0;0 -Intel(R) Graphics [0xe223];3;13;24;5;30000;0;40;13;1;1;24;-2;1;0;0;0;1;0;0;2;0;1 -Intel(R) Graphics [0xe223];3;13;24;13;30000;0;30;13;1;7;24;1;0;0;0;0;1;0;1;0;0;1 -Intel(R) Graphics [0xe223];3;13;24;16;30000;0;47;13;1;1;24;0;-2;0;0;0;1;0;0;1;0;0 -Intel(R) Graphics [0xe223];3;13;24;24;30000;0;30;13;1;1;24;-1;0;0;0;0;1;0;2;0;0;1 -Intel(R) Graphics [0xe223];3;13;24;26;30000;0;15;13;1;1;24;0;0;0;0;0;1;0;0;0;0;1 -Intel(R) Graphics [0xe223];3;13;26;5;30000;0;30;13;1;1;26;0;0;0;0;0;1;0;0;2;0;1 -Intel(R) Graphics [0xe223];3;13;26;13;30000;0;30;13;1;1;26;0;-1;0;0;0;1;0;2;2;0;1 -Intel(R) Graphics [0xe223];3;13;26;16;30000;0;49;13;1;10;26;0;-2;0;0;0;1;0;2;1;0;0 -Intel(R) Graphics [0xe223];3;13;26;24;30000;0;30;13;1;10;26;-2;0;0;0;0;1;0;1;0;0;1 -Intel(R) Graphics [0xe223];3;13;26;26;30000;0;40;13;1;1;26;-1;1;0;0;0;1;0;2;0;0;1 -Intel(R) Graphics [0xe223];3;14;14;14;30000;0;40;14;1;1;14;-1;-2;0;0;0;1;0;0;2;0;0 -Intel(R) Graphics [0xe223];3;14;14;16;30000;0;40;14;1;1;14;-1;0;0;0;0;1;0;0;0;0;0 -Intel(R) Graphics [0xe223];3;14;14;29;30000;0;30;14;1;1;14;-2;-1;0;0;0;1;0;0;0;0;0 -Intel(R) Graphics [0xe223];3;14;16;14;30000;0;42;14;1;2;16;-1;0;0;0;0;1;0;1;0;0;1 -Intel(R) Graphics [0xe223];3;14;16;16;30000;0;40;14;1;12;16;1;0;0;0;0;1;0;1;0;0;1 -Intel(R) Graphics [0xe223];3;14;16;29;30000;0;15;14;1;1;16;-1;-2;0;0;0;1;0;0;0;0;0 -Intel(R) Graphics [0xe223];3;14;29;14;30000;0;30;14;1;6;29;-1;1;0;0;0;1;0;1;2;0;1 -Intel(R) Graphics [0xe223];3;14;29;16;30000;0;30;14;1;4;29;-2;0;0;0;0;1;0;1;2;0;1 -Intel(R) Graphics [0xe223];3;14;29;29;30000;0;15;14;1;1;29;-1;1;0;0;0;1;0;0;0;0;1 -Intel(R) Graphics [0xe223];3;16;5;5;30000;0;30;16;1;14;16;-1;2;0;0;0;1;0;0;2;0;0 -Intel(R) Graphics [0xe223];3;16;5;13;30000;0;30;16;1;16;16;-2;2;0;0;0;1;0;1;0;0;1 -Intel(R) Graphics [0xe223];3;16;5;16;30000;0;40;16;1;15;16;-1;2;0;0;0;1;0;1;2;0;1 -Intel(R) Graphics [0xe223];3;16;5;24;30000;0;15;16;1;9;1;-2;2;0;0;0;1;0;0;1;0;0 -Intel(R) Graphics [0xe223];3;16;5;26;30000;0;25;16;1;4;16;0;2;0;0;0;1;0;0;2;0;0 -Intel(R) Graphics [0xe223];3;16;9;9;30000;0;30;16;1;10;16;0;-2;0;0;0;1;0;2;2;0;1 -Intel(R) Graphics [0xe223];3;16;9;16;30000;0;30;16;1;10;16;-2;-2;0;0;0;1;0;1;0;0;1 -Intel(R) Graphics [0xe223];3;16;9;22;30000;0;15;16;1;1;16;-1;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Graphics [0xe223];3;16;13;5;30000;0;24;16;1;15;1;1;0;0;0;0;1;0;2;0;0;0 -Intel(R) Graphics [0xe223];3;16;13;13;30000;0;24;16;1;8;16;-1;0;0;0;0;1;0;1;2;0;0 -Intel(R) Graphics [0xe223];3;16;13;16;30000;0;17;16;1;5;16;0;1;0;0;0;1;0;0;1;0;0 -Intel(R) Graphics [0xe223];3;16;13;24;30000;0;24;16;1;1;16;1;1;0;0;0;1;0;2;0;0;0 -Intel(R) Graphics [0xe223];3;16;13;26;30000;0;60;16;1;12;16;-2;1;0;0;0;1;0;1;0;0;0 -Intel(R) Graphics [0xe223];3;16;14;14;30000;0;31;16;1;1;16;-2;-2;0;0;0;1;0;0;2;0;1 -Intel(R) Graphics [0xe223];3;16;14;16;30000;0;40;16;1;14;16;-1;0;0;0;0;1;0;1;0;0;1 -Intel(R) Graphics [0xe223];3;16;14;29;30000;0;15;16;1;1;16;-2;0;0;0;0;1;0;0;0;0;0 -Intel(R) Graphics [0xe223];3;16;16;5;30000;0;30;16;1;1;1;1;0;0;0;0;1;0;0;2;0;0 -Intel(R) Graphics [0xe223];3;16;16;9;30000;0;30;16;1;1;16;1;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Graphics [0xe223];3;16;16;13;30000;0;30;16;1;12;16;-2;1;0;0;0;1;0;1;2;0;0 -Intel(R) Graphics [0xe223];3;16;16;14;30000;0;40;16;1;1;16;1;1;0;0;0;1;0;0;0;0;1 -Intel(R) Graphics [0xe223];3;16;16;16;30000;0;15;16;1;1;16;-2;0;0;0;0;1;0;0;2;0;1 -Intel(R) Graphics [0xe223];3;16;16;22;30000;0;15;16;1;1;1;-2;-2;0;0;0;1;0;0;2;0;1 -Intel(R) Graphics [0xe223];3;16;16;24;30000;0;24;16;1;9;16;-2;0;0;0;0;1;0;1;2;0;0 -Intel(R) Graphics [0xe223];3;16;16;26;30000;0;60;16;1;5;16;0;-1;0;0;0;1;0;1;0;0;0 -Intel(R) Graphics [0xe223];3;16;16;29;30000;0;60;16;1;1;16;-2;0;0;0;0;1;0;0;2;0;0 -Intel(R) Graphics [0xe223];3;16;16;55;30000;0;30;16;1;1;16;1;-1;0;0;0;1;0;0;0;0;0 -Intel(R) Graphics [0xe223];3;16;22;9;30000;0;59;16;1;5;22;-1;0;0;0;0;1;0;0;0;0;1 -Intel(R) Graphics [0xe223];3;16;22;16;30000;0;40;16;1;14;22;1;-2;0;0;0;1;0;1;0;0;1 -Intel(R) Graphics [0xe223];3;16;22;22;30000;0;15;16;1;1;22;0;1;0;0;0;1;0;0;0;0;1 -Intel(R) Graphics [0xe223];3;23;23;23;30000;0;15;23;1;1;1;1;1;0;0;0;1;0;0;0;0;0 diff --git a/src/acc/opencl/smm/params/tune_multiply_GH200.csv b/src/acc/opencl/smm/params/tune_multiply_GH200.csv deleted file mode 100644 index 1b0ab725499..00000000000 --- a/src/acc/opencl/smm/params/tune_multiply_GH200.csv +++ /dev/null @@ -1,393 +0,0 @@ -DEVICE;TYPEID;M;N;K;S;GFLOPS;BS;BM;BN;BK;WS;WG;LU;NZ;AL;TB;TC;AP;AA;AB;AC -NVIDIA GH200 480GB [0x3528];3;1;1;1;30000;0;9;1;1;1;1;-2;-2;0;0;0;1;0;2;1;0;0 -NVIDIA GH200 480GB [0x3528];3;2;2;2;30000;0;11;2;1;2;2;0;0;0;0;0;1;0;2;0;0;0 -NVIDIA GH200 480GB [0x3528];3;3;3;3;30000;0;12;3;1;2;3;1;0;0;0;0;1;0;0;0;0;0 -NVIDIA GH200 480GB [0x3528];3;4;4;4;30000;0;16;4;1;1;4;0;0;0;1;0;1;0;2;0;0;0 -NVIDIA GH200 480GB [0x3528];3;4;4;5;30000;0;11;4;1;2;4;-1;-1;0;1;0;1;0;0;2;0;0 -NVIDIA GH200 480GB [0x3528];3;4;4;7;30000;0;12;4;1;3;4;-2;-2;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;4;4;9;30000;0;12;4;1;4;4;0;0;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;4;4;10;30000;0;5;4;1;4;4;0;-1;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;4;4;13;30000;0;4;4;1;3;4;1;-2;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;4;4;15;30000;0;4;4;1;3;4;0;-1;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;4;4;17;30000;0;4;4;1;4;4;0;0;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;4;4;25;30000;0;19;4;1;3;4;-2;-2;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;4;4;26;30000;0;3;4;1;2;4;0;0;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;4;4;28;30000;0;3;4;1;2;4;-1;0;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;4;4;32;30000;0;3;4;1;2;4;-2;-2;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;4;5;4;30000;0;10;4;1;1;5;-2;-2;0;1;0;1;0;0;2;0;0 -NVIDIA GH200 480GB [0x3528];3;4;5;5;30000;0;11;4;1;3;5;1;-2;0;0;0;1;0;2;2;0;0 -NVIDIA GH200 480GB [0x3528];3;4;5;7;30000;0;13;4;1;4;5;1;-1;0;0;0;1;0;0;2;0;0 -NVIDIA GH200 480GB [0x3528];3;4;5;9;30000;0;13;4;1;2;5;1;-1;0;0;0;1;0;0;0;0;0 -NVIDIA GH200 480GB [0x3528];3;4;5;13;30000;0;5;4;1;2;5;1;-2;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;4;5;17;30000;0;4;4;1;4;5;-1;-1;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;4;5;25;30000;0;12;4;1;2;5;-1;-1;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;4;5;32;30000;0;3;4;1;4;5;-1;0;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;4;7;4;30000;0;10;4;1;2;7;-1;0;0;0;0;1;0;0;2;0;0 -NVIDIA GH200 480GB [0x3528];3;4;7;5;30000;0;11;4;1;3;7;0;0;0;0;0;1;0;2;2;0;0 -NVIDIA GH200 480GB [0x3528];3;4;7;7;30000;0;13;4;1;2;7;0;0;0;0;0;1;0;2;2;0;0 -NVIDIA GH200 480GB [0x3528];3;4;7;9;30000;0;5;4;1;4;7;1;-1;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;4;7;13;30000;0;4;4;1;4;7;-2;-2;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;4;9;4;30000;0;11;4;1;2;9;-2;-1;0;0;0;1;0;2;0;0;0 -NVIDIA GH200 480GB [0x3528];3;4;9;5;30000;0;11;4;1;2;9;-2;1;0;1;0;1;0;2;2;0;0 -NVIDIA GH200 480GB [0x3528];3;4;9;7;30000;0;13;4;1;4;9;0;0;0;0;0;1;0;2;2;0;0 -NVIDIA GH200 480GB [0x3528];3;4;9;9;30000;0;10;4;1;2;9;-2;-2;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;4;9;13;30000;0;5;4;1;4;9;-2;-1;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;4;10;4;30000;0;12;4;1;4;10;0;-1;0;0;0;1;0;0;0;0;0 -NVIDIA GH200 480GB [0x3528];3;4;10;10;30000;0;10;4;1;4;10;1;-1;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;4;13;4;30000;0;11;4;1;2;13;-1;-1;0;0;0;1;0;0;0;0;0 -NVIDIA GH200 480GB [0x3528];3;4;13;5;30000;0;11;4;1;2;13;-2;0;0;1;0;1;0;2;2;0;0 -NVIDIA GH200 480GB [0x3528];3;4;13;7;30000;0;15;4;1;1;1;0;0;0;0;0;1;0;0;2;0;0 -NVIDIA GH200 480GB [0x3528];3;4;13;9;30000;0;10;4;1;2;1;0;-2;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;4;13;13;30000;0;12;4;1;4;1;0;0;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;4;13;17;30000;0;10;4;1;4;1;-2;0;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;4;13;32;30000;0;12;4;1;2;1;-1;1;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;4;15;4;30000;0;11;4;1;2;1;-1;0;0;1;0;1;0;2;0;0;0 -NVIDIA GH200 480GB [0x3528];3;4;17;4;30000;0;16;4;1;3;1;1;-1;0;0;0;1;0;2;2;0;0 -NVIDIA GH200 480GB [0x3528];3;4;17;5;30000;0;13;4;1;2;1;0;-1;0;0;0;1;0;0;2;0;0 -NVIDIA GH200 480GB [0x3528];3;4;17;13;30000;0;14;4;1;2;1;-1;-2;0;0;0;1;0;2;0;0;0 -NVIDIA GH200 480GB [0x3528];3;4;17;17;30000;0;9;4;1;4;1;-1;-1;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;4;17;32;30000;0;12;4;1;4;1;1;-1;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;4;25;4;30000;0;14;4;1;3;1;0;-1;0;0;0;1;0;2;2;0;0 -NVIDIA GH200 480GB [0x3528];3;4;25;5;30000;0;14;4;1;2;25;-2;1;0;1;0;1;0;2;2;0;0 -NVIDIA GH200 480GB [0x3528];3;4;26;4;30000;0;13;4;1;2;1;-1;1;0;1;0;1;0;0;2;0;0 -NVIDIA GH200 480GB [0x3528];3;4;28;4;30000;0;14;4;1;3;1;-1;-2;0;0;0;1;0;2;0;0;0 -NVIDIA GH200 480GB [0x3528];3;4;32;4;30000;0;18;4;1;1;1;0;-2;0;0;0;1;0;0;2;0;0 -NVIDIA GH200 480GB [0x3528];3;4;32;5;30000;0;14;4;1;1;1;-1;0;0;0;0;1;0;0;0;0;0 -NVIDIA GH200 480GB [0x3528];3;4;32;13;30000;0;11;4;1;2;1;1;1;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;4;32;17;30000;0;8;4;1;2;1;0;-1;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;4;32;32;30000;0;13;4;1;4;1;1;-2;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;5;4;4;30000;0;14;5;1;2;1;-1;-1;0;0;0;1;0;0;0;0;0 -NVIDIA GH200 480GB [0x3528];3;5;4;5;30000;0;13;5;1;4;1;-2;-1;0;0;0;1;0;0;2;0;0 -NVIDIA GH200 480GB [0x3528];3;5;4;7;30000;0;13;5;1;2;1;0;-2;0;0;0;1;0;0;0;0;0 -NVIDIA GH200 480GB [0x3528];3;5;4;9;30000;0;11;5;1;1;1;-2;0;0;0;0;1;0;2;2;0;0 -NVIDIA GH200 480GB [0x3528];3;5;4;13;30000;0;12;5;1;4;5;-1;-1;0;0;0;1;0;0;0;0;0 -NVIDIA GH200 480GB [0x3528];3;5;4;17;30000;0;12;5;1;2;5;1;0;0;0;0;1;0;0;2;0;0 -NVIDIA GH200 480GB [0x3528];3;5;4;25;30000;0;12;5;1;4;5;0;-1;0;0;0;1;0;0;0;0;0 -NVIDIA GH200 480GB [0x3528];3;5;4;32;30000;0;12;5;1;2;5;-1;1;0;0;0;1;0;2;0;0;0 -NVIDIA GH200 480GB [0x3528];3;5;5;4;30000;0;11;5;1;1;1;1;-1;0;0;0;1;0;2;0;0;0 -NVIDIA GH200 480GB [0x3528];3;5;5;5;30000;0;12;5;1;4;1;1;-2;0;1;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;5;5;7;30000;0;12;5;1;3;1;-1;-2;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;5;5;9;30000;0;12;5;1;2;1;-2;1;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;5;5;13;30000;0;5;5;1;4;1;-2;0;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;5;5;16;30000;0;8;5;1;2;5;1;-2;0;0;0;1;0;2;0;0;0 -NVIDIA GH200 480GB [0x3528];3;5;5;17;30000;0;4;5;1;4;1;0;0;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;5;5;24;30000;0;10;5;1;4;5;-1;0;0;0;0;1;0;0;2;0;0 -NVIDIA GH200 480GB [0x3528];3;5;5;26;30000;0;12;5;1;5;5;-1;0;0;0;0;1;0;0;2;0;0 -NVIDIA GH200 480GB [0x3528];3;5;5;28;30000;0;19;5;1;3;5;-1;0;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;5;5;32;30000;0;3;5;1;3;1;1;0;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;5;7;4;30000;0;15;5;1;2;1;-2;-1;0;0;0;1;0;2;0;0;0 -NVIDIA GH200 480GB [0x3528];3;5;7;5;30000;0;13;5;1;4;1;-2;-2;0;0;0;1;0;2;0;0;0 -NVIDIA GH200 480GB [0x3528];3;5;7;7;30000;0;10;5;1;2;1;-1;1;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;5;7;9;30000;0;10;5;1;2;1;0;-1;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;5;7;13;30000;0;10;5;1;3;1;-1;-1;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;5;9;4;30000;0;11;5;1;5;1;-1;0;0;1;0;1;0;0;0;0;0 -NVIDIA GH200 480GB [0x3528];3;5;9;5;30000;0;13;5;1;1;1;1;-2;0;0;0;1;0;0;2;0;0 -NVIDIA GH200 480GB [0x3528];3;5;9;7;30000;0;9;5;1;2;1;0;0;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;5;9;9;30000;0;10;5;1;2;1;0;-1;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;5;13;4;30000;0;13;5;1;2;1;-1;-1;0;0;0;1;0;0;0;0;0 -NVIDIA GH200 480GB [0x3528];3;5;13;5;30000;0;13;5;1;1;1;0;-1;0;0;0;1;0;2;0;0;0 -NVIDIA GH200 480GB [0x3528];3;5;13;7;30000;0;8;5;1;3;1;1;-2;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;5;13;13;30000;0;10;5;1;2;1;1;0;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;5;13;16;30000;0;10;5;1;1;13;-1;-1;0;1;0;1;0;2;2;0;0 -NVIDIA GH200 480GB [0x3528];3;5;13;17;30000;0;12;5;1;2;1;0;-1;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;5;13;24;30000;0;8;5;1;5;13;0;-1;0;0;0;1;0;2;2;0;0 -NVIDIA GH200 480GB [0x3528];3;5;13;26;30000;0;14;5;1;3;13;-2;-1;0;0;0;1;0;0;2;0;0 -NVIDIA GH200 480GB [0x3528];3;5;13;28;30000;0;5;5;1;2;13;-2;-1;0;1;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;5;13;32;30000;0;4;5;1;5;1;0;-1;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;5;16;5;30000;0;11;5;1;2;16;-2;1;0;1;0;1;0;0;0;0;0 -NVIDIA GH200 480GB [0x3528];3;5;16;13;30000;0;11;5;1;4;16;-2;0;0;0;0;1;0;0;2;0;0 -NVIDIA GH200 480GB [0x3528];3;5;16;16;30000;0;11;5;1;2;16;1;0;0;1;0;1;0;2;2;0;0 -NVIDIA GH200 480GB [0x3528];3;5;16;24;30000;0;8;5;1;5;16;0;-1;0;0;0;1;0;2;2;0;0 -NVIDIA GH200 480GB [0x3528];3;5;16;26;30000;0;8;5;1;2;16;0;1;0;0;0;1;0;0;2;0;0 -NVIDIA GH200 480GB [0x3528];3;5;17;4;30000;0;14;5;1;2;1;0;0;0;0;0;1;0;0;0;0;0 -NVIDIA GH200 480GB [0x3528];3;5;17;5;30000;0;13;5;1;5;1;-2;-1;0;0;0;1;0;2;2;0;0 -NVIDIA GH200 480GB [0x3528];3;5;17;13;30000;0;10;5;1;2;1;-2;-1;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;5;17;17;30000;0;16;5;1;2;1;-2;-1;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;5;17;32;30000;0;10;5;1;2;1;-1;0;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;5;24;5;30000;0;16;5;1;1;24;-2;-1;0;0;0;1;0;2;0;0;0 -NVIDIA GH200 480GB [0x3528];3;5;24;13;30000;0;10;5;1;3;24;-2;-1;0;1;0;1;0;0;0;0;0 -NVIDIA GH200 480GB [0x3528];3;5;24;16;30000;0;8;5;1;5;24;1;-1;0;0;0;1;0;2;2;0;0 -NVIDIA GH200 480GB [0x3528];3;5;24;24;30000;0;8;5;1;2;24;0;1;0;0;0;1;0;0;0;0;0 -NVIDIA GH200 480GB [0x3528];3;5;24;26;30000;0;12;5;1;4;24;-2;1;0;0;0;1;0;0;0;0;0 -NVIDIA GH200 480GB [0x3528];3;5;25;4;30000;0;18;5;1;2;1;-2;-1;0;0;0;1;0;2;0;0;0 -NVIDIA GH200 480GB [0x3528];3;5;26;5;30000;0;17;5;1;1;26;-2;-1;0;1;0;1;0;2;0;0;0 -NVIDIA GH200 480GB [0x3528];3;5;26;13;30000;0;14;5;1;2;26;-2;-1;0;1;0;1;0;2;0;0;0 -NVIDIA GH200 480GB [0x3528];3;5;26;16;30000;0;8;5;1;5;26;-2;0;0;0;0;1;0;2;2;0;0 -NVIDIA GH200 480GB [0x3528];3;5;26;24;30000;0;8;5;1;5;26;0;0;0;0;0;1;0;2;2;0;0 -NVIDIA GH200 480GB [0x3528];3;5;26;26;30000;0;8;5;1;2;26;-2;1;0;0;0;1;0;2;0;0;0 -NVIDIA GH200 480GB [0x3528];3;5;32;4;30000;0;15;5;1;2;1;1;-1;0;0;0;1;0;2;0;0;0 -NVIDIA GH200 480GB [0x3528];3;5;32;5;30000;0;13;5;1;1;1;0;-1;0;0;0;1;0;0;2;0;0 -NVIDIA GH200 480GB [0x3528];3;5;32;13;30000;0;11;5;1;4;1;0;-2;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;5;32;17;30000;0;11;5;1;5;1;0;0;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;5;32;32;30000;0;12;5;1;4;1;0;-2;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;6;6;6;30000;0;10;6;1;2;1;1;-2;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;6;6;7;30000;0;12;6;1;6;1;-1;0;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;6;6;8;30000;0;12;6;1;3;1;-1;0;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;6;7;6;30000;0;10;6;1;4;1;1;-2;0;1;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;6;7;7;30000;0;10;6;1;2;1;0;-1;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;6;7;8;30000;0;10;6;1;3;1;-2;1;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;6;8;6;30000;0;9;6;1;2;1;-2;0;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;6;8;7;30000;0;10;6;1;6;1;1;-1;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;6;8;8;30000;0;10;6;1;2;1;0;1;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;7;4;4;30000;0;13;7;1;2;1;1;0;0;0;0;1;0;0;2;0;0 -NVIDIA GH200 480GB [0x3528];3;7;4;5;30000;0;13;7;1;4;1;-2;0;0;1;0;1;0;2;2;0;0 -NVIDIA GH200 480GB [0x3528];3;7;4;7;30000;0;13;7;1;2;1;-2;-1;0;0;0;1;0;2;0;0;0 -NVIDIA GH200 480GB [0x3528];3;7;4;9;30000;0;11;7;1;3;1;-1;2;0;0;0;1;0;0;0;0;0 -NVIDIA GH200 480GB [0x3528];3;7;4;13;30000;0;12;7;1;7;7;0;-1;0;0;0;1;0;2;2;0;0 -NVIDIA GH200 480GB [0x3528];3;7;5;4;30000;0;12;7;1;3;1;-2;-1;0;0;0;1;0;0;2;0;0 -NVIDIA GH200 480GB [0x3528];3;7;5;5;30000;0;11;7;1;3;1;0;0;0;0;0;1;0;0;2;0;0 -NVIDIA GH200 480GB [0x3528];3;7;5;7;30000;0;12;7;1;4;7;-2;0;0;0;0;1;0;0;0;0;0 -NVIDIA GH200 480GB [0x3528];3;7;5;9;30000;0;12;7;1;3;1;-2;-1;0;0;0;1;0;0;0;0;0 -NVIDIA GH200 480GB [0x3528];3;7;5;13;30000;0;12;7;1;3;1;-1;-2;0;0;0;1;0;2;0;0;0 -NVIDIA GH200 480GB [0x3528];3;7;6;6;30000;0;11;7;1;4;1;0;-2;0;1;0;1;0;2;2;0;0 -NVIDIA GH200 480GB [0x3528];3;7;6;7;30000;0;12;7;1;3;1;-1;2;0;0;0;1;0;2;2;0;0 -NVIDIA GH200 480GB [0x3528];3;7;6;8;30000;0;12;7;1;2;1;1;-2;0;0;0;1;0;2;2;0;0 -NVIDIA GH200 480GB [0x3528];3;7;7;4;30000;0;15;7;1;4;1;-1;-2;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;7;7;5;30000;0;12;7;1;5;1;-2;0;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;7;7;6;30000;0;10;7;1;4;1;-2;-2;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;7;7;7;30000;0;10;7;1;6;1;0;-2;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;7;7;8;30000;0;12;7;1;5;1;0;0;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;7;7;9;30000;0;10;7;1;4;1;-1;0;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;7;7;13;30000;0;12;7;1;7;1;-2;-2;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;7;8;6;30000;0;10;7;1;2;1;-2;-2;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;7;8;7;30000;0;12;7;1;3;1;0;4;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;7;8;8;30000;0;10;7;1;7;1;1;-2;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;7;9;4;30000;0;14;7;1;1;1;-2;-2;0;0;0;1;0;2;0;0;0 -NVIDIA GH200 480GB [0x3528];3;7;9;5;30000;0;10;7;1;4;1;-1;-1;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;7;9;7;30000;0;12;7;1;5;1;1;-2;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;7;13;4;30000;0;14;7;1;4;1;1;-1;0;0;0;1;0;0;0;0;0 -NVIDIA GH200 480GB [0x3528];3;7;13;5;30000;0;13;7;1;5;1;-1;-2;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;7;13;7;30000;0;12;7;1;4;1;1;-2;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;7;13;13;30000;0;10;7;1;6;1;-2;-1;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;8;6;6;30000;0;11;8;1;7;1;1;0;0;0;0;1;0;2;0;0;0 -NVIDIA GH200 480GB [0x3528];3;8;6;7;30000;0;12;8;1;6;1;-1;-2;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;8;6;8;30000;0;11;8;1;1;1;-1;-2;0;0;0;1;0;2;2;0;0 -NVIDIA GH200 480GB [0x3528];3;8;7;6;30000;0;12;8;1;7;1;-1;-1;0;0;0;1;0;2;0;0;0 -NVIDIA GH200 480GB [0x3528];3;8;7;7;30000;0;12;8;1;7;1;-1;0;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;8;7;8;30000;0;11;8;1;1;1;-1;0;0;0;0;1;0;2;2;0;0 -NVIDIA GH200 480GB [0x3528];3;8;8;6;30000;0;10;8;1;2;1;0;-2;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;8;8;7;30000;0;12;8;1;2;1;0;0;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;8;8;8;30000;0;12;8;1;2;1;-2;1;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;9;4;4;30000;0;13;9;1;2;1;0;-1;0;0;0;1;0;2;0;0;0 -NVIDIA GH200 480GB [0x3528];3;9;4;5;30000;0;13;9;1;7;1;0;0;0;0;0;1;0;2;0;0;0 -NVIDIA GH200 480GB [0x3528];3;9;4;7;30000;0;12;9;1;7;1;-2;0;0;0;0;1;0;0;0;0;0 -NVIDIA GH200 480GB [0x3528];3;9;4;9;30000;0;10;8;1;7;9;1;-2;0;0;0;1;0;2;0;0;0 -NVIDIA GH200 480GB [0x3528];3;9;4;13;30000;0;12;9;1;9;9;-1;-2;0;0;0;1;0;2;0;0;0 -NVIDIA GH200 480GB [0x3528];3;9;5;4;30000;0;11;9;1;4;1;-2;-1;0;0;0;1;0;2;0;0;0 -NVIDIA GH200 480GB [0x3528];3;9;5;5;30000;0;13;9;1;9;1;0;0;0;0;0;1;0;0;0;0;0 -NVIDIA GH200 480GB [0x3528];3;9;5;7;30000;0;10;8;1;2;9;1;1;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;9;5;9;30000;0;5;9;1;8;1;1;2;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;9;7;4;30000;0;12;9;1;2;1;-2;-1;0;0;0;1;0;2;0;0;0 -NVIDIA GH200 480GB [0x3528];3;9;7;5;30000;0;8;8;1;9;1;1;1;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;9;7;7;30000;0;10;8;1;3;1;-1;-1;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;9;9;4;30000;0;17;9;1;7;1;-1;-2;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;9;9;5;30000;0;17;9;1;4;1;-2;0;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;9;9;9;30000;0;12;9;1;4;1;-2;0;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;9;9;16;30000;0;19;9;1;8;1;0;0;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;9;9;22;30000;0;12;8;1;7;1;0;-1;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;9;9;32;30000;0;6;9;1;8;1;-2;-1;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;9;13;4;30000;0;13;9;1;2;1;-2;1;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;9;16;9;30000;0;16;9;1;7;1;-1;0;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;9;16;16;30000;0;10;8;1;2;1;0;-2;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;9;16;22;30000;0;6;8;1;2;1;-2;2;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;9;22;9;30000;0;16;9;1;7;1;0;-1;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;9;22;16;30000;0;12;9;1;5;1;-2;-2;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;9;22;22;30000;0;15;9;1;8;1;1;0;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;9;22;32;30000;0;15;9;1;7;1;-1;0;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;9;32;9;30000;0;16;9;1;6;32;1;0;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;9;32;22;30000;0;15;9;1;9;32;-1;-1;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;9;32;32;30000;0;12;9;1;2;32;0;1;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;10;4;4;30000;0;8;8;1;5;1;0;1;0;0;0;1;0;0;0;0;0 -NVIDIA GH200 480GB [0x3528];3;10;4;10;30000;0;10;8;1;3;10;0;3;0;0;0;1;0;0;2;0;0 -NVIDIA GH200 480GB [0x3528];3;10;10;4;30000;0;17;10;1;7;1;0;-1;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;10;10;10;30000;0;12;10;1;7;1;1;-2;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;13;4;4;30000;0;8;8;1;7;1;1;-1;0;0;0;1;0;2;2;0;0 -NVIDIA GH200 480GB [0x3528];3;13;4;5;30000;0;8;8;1;2;13;-1;2;0;0;0;1;0;0;0;0;0 -NVIDIA GH200 480GB [0x3528];3;13;4;7;30000;0;10;8;1;2;1;0;1;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;13;4;9;30000;0;9;8;1;10;13;0;2;0;0;0;1;0;0;0;0;0 -NVIDIA GH200 480GB [0x3528];3;13;4;13;30000;0;6;8;1;9;13;-2;6;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;13;4;17;30000;0;5;8;1;7;13;0;4;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;13;4;32;30000;0;12;8;1;13;1;0;2;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;13;5;4;30000;0;8;8;1;8;1;-2;3;0;0;0;1;0;0;2;0;0 -NVIDIA GH200 480GB [0x3528];3;13;5;5;30000;0;8;8;1;3;1;1;2;0;0;0;1;0;0;2;0;0 -NVIDIA GH200 480GB [0x3528];3;13;5;7;30000;0;9;8;1;10;1;0;0;0;0;0;1;0;0;0;0;0 -NVIDIA GH200 480GB [0x3528];3;13;5;13;30000;0;9;8;1;5;13;1;-2;0;0;0;1;0;2;2;0;0 -NVIDIA GH200 480GB [0x3528];3;13;5;16;30000;0;8;13;1;11;13;1;0;0;0;0;1;0;2;2;0;0 -NVIDIA GH200 480GB [0x3528];3;13;5;17;30000;0;12;8;1;7;1;-1;-1;0;0;0;1;0;0;2;0;0 -NVIDIA GH200 480GB [0x3528];3;13;5;24;30000;0;6;13;1;12;13;-2;2;0;0;0;1;0;0;2;0;0 -NVIDIA GH200 480GB [0x3528];3;13;5;26;30000;0;6;13;1;13;13;-2;2;0;1;0;1;0;0;0;0;0 -NVIDIA GH200 480GB [0x3528];3;13;5;28;30000;0;3;13;1;3;13;-2;2;0;0;0;1;0;0;2;0;0 -NVIDIA GH200 480GB [0x3528];3;13;5;32;30000;0;3;8;1;3;1;0;-2;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;13;7;4;30000;0;11;8;1;4;1;1;-1;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;13;7;5;30000;0;9;8;1;4;1;0;0;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;13;7;7;30000;0;13;8;1;13;1;-2;1;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;13;7;13;30000;0;12;8;1;4;1;0;1;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;13;9;4;30000;0;12;8;1;11;1;1;2;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;13;13;4;30000;0;17;13;1;11;1;-2;-2;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;13;13;5;30000;0;17;13;1;9;1;-1;-2;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;13;13;7;30000;0;16;13;1;4;13;-2;-2;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;13;13;13;30000;0;12;13;1;6;1;-1;0;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;13;13;16;30000;0;10;13;1;11;13;1;2;0;0;0;1;0;0;2;0;0 -NVIDIA GH200 480GB [0x3528];3;13;13;17;30000;0;15;13;1;10;1;1;0;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;13;13;24;30000;0;13;13;1;9;13;-2;2;0;1;0;1;0;0;2;0;0 -NVIDIA GH200 480GB [0x3528];3;13;13;26;30000;0;18;13;1;7;13;-2;2;0;0;0;1;0;0;0;0;0 -NVIDIA GH200 480GB [0x3528];3;13;13;28;30000;0;19;13;1;13;13;-1;-2;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;13;13;32;30000;0;19;13;1;9;1;1;-2;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;13;16;5;30000;0;13;13;1;12;16;1;0;0;1;0;1;0;2;2;0;0 -NVIDIA GH200 480GB [0x3528];3;13;16;13;30000;0;10;13;1;9;16;1;-2;0;1;0;1;0;0;2;0;0 -NVIDIA GH200 480GB [0x3528];3;13;16;16;30000;0;8;13;1;13;16;0;-1;0;0;0;1;0;2;2;0;0 -NVIDIA GH200 480GB [0x3528];3;13;16;24;30000;0;21;13;1;13;16;-2;2;0;1;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;13;16;26;30000;0;15;8;1;13;16;0;2;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;13;17;4;30000;0;17;13;1;10;1;1;0;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;13;17;5;30000;0;17;13;1;6;1;-1;-2;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;13;17;13;30000;0;16;13;1;6;1;1;1;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;13;17;17;30000;0;15;13;1;3;1;0;0;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;13;17;32;30000;0;20;13;1;3;1;1;-1;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;13;24;5;30000;0;14;13;1;9;24;0;2;0;1;0;1;0;0;2;0;0 -NVIDIA GH200 480GB [0x3528];3;13;24;13;30000;0;8;13;1;9;24;-1;-2;0;0;0;1;0;0;0;0;0 -NVIDIA GH200 480GB [0x3528];3;13;24;16;30000;0;8;13;1;10;24;0;0;0;1;0;1;0;0;2;0;0 -NVIDIA GH200 480GB [0x3528];3;13;24;24;30000;0;16;13;1;6;24;0;-1;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;13;24;26;30000;0;30;13;1;4;24;-2;2;0;0;0;1;0;2;2;0;0 -NVIDIA GH200 480GB [0x3528];3;13;26;5;30000;0;16;13;1;12;26;-2;2;0;1;0;1;0;0;2;0;0 -NVIDIA GH200 480GB [0x3528];3;13;26;13;30000;0;17;13;1;2;26;0;2;0;1;0;1;0;2;0;0;0 -NVIDIA GH200 480GB [0x3528];3;13;26;16;30000;0;8;13;1;13;26;0;-1;0;0;0;1;0;2;2;0;0 -NVIDIA GH200 480GB [0x3528];3;13;26;24;30000;0;15;13;1;2;26;-1;1;0;1;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;13;26;26;30000;0;8;13;1;9;26;0;0;0;1;0;1;0;0;2;0;0 -NVIDIA GH200 480GB [0x3528];3;13;32;4;30000;0;21;8;1;13;1;1;2;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;13;32;5;30000;0;17;13;1;5;1;1;-2;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;13;32;13;30000;0;18;13;1;2;1;-1;-2;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;13;32;17;30000;0;19;8;1;4;1;0;3;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;13;32;32;30000;0;15;13;1;11;1;0;-1;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;14;14;14;30000;0;16;14;1;14;14;1;-2;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;14;14;16;30000;0;14;14;1;11;14;1;2;0;0;0;1;0;0;2;0;0 -NVIDIA GH200 480GB [0x3528];3;14;14;29;30000;0;9;14;1;4;14;0;2;0;1;0;1;0;0;0;0;0 -NVIDIA GH200 480GB [0x3528];3;14;14;55;30000;0;20;14;1;7;14;-1;2;0;1;0;1;0;1;1;0;0 -NVIDIA GH200 480GB [0x3528];3;14;16;14;30000;0;8;14;1;13;16;0;-2;0;0;0;1;0;0;0;0;0 -NVIDIA GH200 480GB [0x3528];3;14;16;16;30000;0;12;14;1;9;16;-1;2;0;1;0;1;0;0;2;0;0 -NVIDIA GH200 480GB [0x3528];3;14;16;29;30000;0;9;14;1;11;16;0;2;0;1;0;1;0;2;0;0;0 -NVIDIA GH200 480GB [0x3528];3;14;29;14;30000;0;19;8;1;14;29;-1;-1;0;1;0;1;0;0;2;0;0 -NVIDIA GH200 480GB [0x3528];3;14;55;14;30000;0;26;14;1;7;55;-2;1;0;1;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;14;55;55;30000;0;60;14;1;10;55;0;0;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;15;4;4;30000;0;8;8;1;3;1;1;2;0;0;0;1;0;2;2;0;0 -NVIDIA GH200 480GB [0x3528];3;15;15;15;30000;0;21;15;1;10;1;-1;0;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;16;9;9;30000;0;12;8;1;16;1;-2;3;0;0;0;1;0;2;2;0;0 -NVIDIA GH200 480GB [0x3528];3;16;9;16;30000;0;10;8;1;14;16;1;0;0;0;0;1;0;2;2;0;0 -NVIDIA GH200 480GB [0x3528];3;16;9;22;30000;0;12;8;1;14;16;-2;0;0;0;0;1;0;2;0;0;0 -NVIDIA GH200 480GB [0x3528];3;16;16;9;30000;0;16;8;1;3;1;0;2;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;16;16;16;30000;0;12;8;1;13;1;1;0;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;16;16;22;30000;0;21;16;1;13;1;-2;0;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;16;16;55;30000;0;30;8;1;2;16;1;2;0;1;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;16;22;9;30000;0;16;16;1;8;1;0;-2;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;16;22;16;30000;0;20;16;1;14;1;-1;-2;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;16;22;22;30000;0;15;16;1;9;1;0;0;0;1;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;16;29;55;30000;0;38;8;1;13;29;0;-2;0;1;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;16;55;16;30000;0;23;16;1;6;55;-1;0;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;16;55;29;30000;0;60;8;1;9;55;0;2;0;1;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;16;55;55;30000;0;5;8;1;5;55;-2;0;0;1;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;17;4;4;30000;0;8;8;1;9;1;-2;0;0;0;0;1;0;2;2;0;0 -NVIDIA GH200 480GB [0x3528];3;17;4;5;30000;0;10;8;1;14;1;0;0;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;17;4;13;30000;0;5;8;1;3;17;0;1;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;17;4;17;30000;0;12;8;1;14;17;0;-2;0;0;0;1;0;0;2;0;0 -NVIDIA GH200 480GB [0x3528];3;17;4;32;30000;0;3;8;1;2;17;-1;-2;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;17;5;4;30000;0;8;8;1;15;1;1;2;0;0;0;1;0;0;2;0;0 -NVIDIA GH200 480GB [0x3528];3;17;5;5;30000;0;8;8;1;15;17;-2;-2;0;0;0;1;0;2;0;0;0 -NVIDIA GH200 480GB [0x3528];3;17;5;13;30000;0;10;8;1;7;17;0;-2;0;0;0;1;0;2;0;0;0 -NVIDIA GH200 480GB [0x3528];3;17;5;17;30000;0;12;8;1;9;17;-2;-1;0;0;0;1;0;0;2;0;0 -NVIDIA GH200 480GB [0x3528];3;17;5;32;30000;0;16;8;1;2;17;-1;0;0;0;0;1;0;2;2;0;0 -NVIDIA GH200 480GB [0x3528];3;17;13;4;30000;0;14;17;1;11;1;0;-2;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;17;13;5;30000;0;13;17;1;5;1;-1;0;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;17;13;13;30000;0;19;8;1;16;1;-1;2;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;17;13;17;30000;0;17;17;1;7;1;1;0;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;17;13;32;30000;0;19;17;1;16;1;-1;0;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;17;17;4;30000;0;23;17;1;7;1;-2;0;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;17;17;5;30000;0;23;17;1;15;1;-1;-1;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;17;17;13;30000;0;21;17;1;8;1;-1;0;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;17;17;17;30000;0;16;17;1;9;1;0;-2;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;17;17;32;30000;0;5;17;1;3;1;0;-1;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;17;32;4;30000;0;23;17;1;11;1;-2;-1;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;17;32;5;30000;0;22;17;1;6;1;0;-2;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;17;32;13;30000;0;15;17;1;9;1;-2;-1;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;17;32;17;30000;0;15;17;1;13;1;0;-1;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;17;32;32;30000;0;20;17;1;17;1;-2;-2;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;20;20;20;30000;0;19;20;1;8;1;1;0;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;22;9;9;30000;0;10;8;1;9;1;0;3;0;0;0;1;0;2;0;0;0 -NVIDIA GH200 480GB [0x3528];3;22;9;16;30000;0;10;8;1;21;1;-1;1;0;0;0;1;0;0;2;0;0 -NVIDIA GH200 480GB [0x3528];3;22;9;22;30000;0;12;8;1;6;22;1;0;0;0;0;1;0;2;2;0;0 -NVIDIA GH200 480GB [0x3528];3;22;9;32;30000;0;20;8;1;20;22;0;1;0;0;0;1;0;2;2;0;0 -NVIDIA GH200 480GB [0x3528];3;22;16;9;30000;0;19;8;1;5;1;-2;4;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;22;16;16;30000;0;19;8;1;15;1;0;-2;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;22;16;22;30000;0;12;8;1;3;1;0;2;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;22;22;9;30000;0;23;22;1;17;1;0;0;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;22;22;16;30000;0;20;22;1;5;1;1;-1;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;22;22;22;30000;0;23;22;1;14;1;-1;-2;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;22;22;32;30000;0;30;22;1;7;1;0;-1;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;22;32;9;30000;0;17;22;1;20;32;-1;0;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;22;32;22;30000;0;20;22;1;9;32;0;-1;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;22;32;32;30000;0;40;8;1;3;32;-1;3;0;1;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;23;23;23;30000;0;20;23;1;17;23;1;0;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;24;24;24;30000;0;20;24;1;16;1;-2;-2;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;24;24;26;30000;0;30;8;1;18;24;1;2;0;1;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;24;26;24;30000;0;19;8;1;24;26;0;0;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;24;26;26;30000;0;30;24;1;2;26;-1;1;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;25;4;4;30000;0;8;8;1;13;25;0;-2;0;0;0;1;0;2;2;0;0 -NVIDIA GH200 480GB [0x3528];3;25;4;5;30000;0;8;8;1;18;25;0;5;0;0;0;1;0;0;2;0;0 -NVIDIA GH200 480GB [0x3528];3;25;5;4;30000;0;8;8;1;21;1;-2;1;0;0;0;1;0;0;2;0;0 -NVIDIA GH200 480GB [0x3528];3;25;25;25;30000;0;24;25;1;21;1;-1;-1;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;26;4;4;30000;0;10;8;1;6;26;-1;3;0;0;0;1;0;0;2;0;0 -NVIDIA GH200 480GB [0x3528];3;26;24;24;30000;0;11;8;1;2;26;-2;-2;0;1;0;1;0;2;2;0;0 -NVIDIA GH200 480GB [0x3528];3;26;24;26;30000;0;46;8;1;14;26;-1;0;0;1;0;1;0;0;0;0;0 -NVIDIA GH200 480GB [0x3528];3;26;26;24;30000;0;29;26;1;12;26;-1;0;0;1;0;1;0;1;1;0;0 -NVIDIA GH200 480GB [0x3528];3;26;26;26;30000;0;32;8;1;22;26;-1;2;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;28;4;4;30000;0;11;8;1;12;1;-1;5;0;0;0;1;0;0;2;0;0 -NVIDIA GH200 480GB [0x3528];3;28;28;28;30000;0;6;16;1;8;1;-2;2;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;29;16;55;30000;0;21;16;1;15;29;0;2;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;29;29;29;30000;0;46;8;1;2;29;-2;-2;0;1;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;29;29;55;30000;0;19;16;1;24;29;-2;0;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;29;55;16;30000;0;58;8;1;26;55;1;-2;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;29;55;29;30000;0;19;8;1;25;55;-2;4;0;1;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;29;55;55;30000;0;13;29;1;8;55;0;0;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;30;30;30;30000;0;30;30;1;11;1;0;-2;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;32;4;4;30000;0;11;8;1;15;32;-1;-2;0;0;0;1;0;0;0;0;0 -NVIDIA GH200 480GB [0x3528];3;32;4;5;30000;0;11;8;1;16;32;1;0;0;0;0;1;0;0;2;0;0 -NVIDIA GH200 480GB [0x3528];3;32;4;13;30000;0;10;8;1;1;32;1;0;0;0;0;1;0;0;0;0;0 -NVIDIA GH200 480GB [0x3528];3;32;4;17;30000;0;12;8;1;9;32;1;0;0;0;0;1;0;0;2;0;0 -NVIDIA GH200 480GB [0x3528];3;32;4;32;30000;0;6;8;1;21;32;1;4;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;32;5;4;30000;0;14;8;1;14;1;1;-2;0;0;0;1;0;2;0;0;0 -NVIDIA GH200 480GB [0x3528];3;32;5;5;30000;0;15;8;1;10;1;-2;-2;0;0;0;1;0;2;2;0;0 -NVIDIA GH200 480GB [0x3528];3;32;5;13;30000;0;10;8;1;31;32;1;-2;0;0;0;1;0;0;2;0;0 -NVIDIA GH200 480GB [0x3528];3;32;5;17;30000;0;12;8;1;3;32;0;4;0;0;0;1;0;0;2;0;0 -NVIDIA GH200 480GB [0x3528];3;32;5;32;30000;0;15;8;1;25;32;0;0;0;0;0;1;0;2;0;0;0 -NVIDIA GH200 480GB [0x3528];3;32;13;4;30000;0;23;8;1;4;1;-1;-2;0;0;0;1;0;0;2;0;0 -NVIDIA GH200 480GB [0x3528];3;32;13;5;30000;0;23;8;1;4;1;-1;-2;0;0;0;1;0;0;0;0;0 -NVIDIA GH200 480GB [0x3528];3;32;13;13;30000;0;20;8;1;18;1;-1;5;0;0;0;1;0;0;0;0;0 -NVIDIA GH200 480GB [0x3528];3;32;13;17;30000;0;30;8;1;5;1;-2;-2;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;32;13;32;30000;0;13;8;1;16;1;-1;0;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;32;17;4;30000;0;23;32;1;17;1;-1;0;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;32;17;5;30000;0;18;32;1;14;1;-1;1;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;32;17;13;30000;0;20;32;1;11;1;0;0;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;32;17;17;30000;0;20;32;1;4;1;-2;-1;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;32;17;32;30000;0;10;8;1;23;1;1;4;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;32;32;4;30000;0;26;32;1;4;1;0;-1;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;32;32;5;30000;0;29;32;1;11;1;1;0;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;32;32;9;30000;0;23;32;1;21;32;0;-2;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;32;32;13;30000;0;30;32;1;6;1;0;-1;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;32;32;17;30000;0;23;32;1;22;1;0;-1;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;32;32;22;30000;0;20;32;1;27;32;0;-2;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;32;32;32;30000;0;30;32;1;6;32;0;-1;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;35;35;35;30000;0;57;24;1;17;1;0;2;0;1;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;36;36;36;30000;0;15;16;1;23;1;0;1;0;1;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;40;40;40;30000;0;57;16;1;6;1;-1;1;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;55;14;14;30000;0;23;55;1;29;55;-1;4;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;55;14;55;30000;0;8;55;1;2;55;1;7;0;0;0;1;0;1;1;0;0 -NVIDIA GH200 480GB [0x3528];3;55;16;16;30000;0;30;16;1;45;55;-2;-2;0;1;0;1;0;1;1;0;0 -NVIDIA GH200 480GB [0x3528];3;55;16;29;30000;0;46;16;1;18;55;1;7;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;55;16;55;30000;0;19;8;1;38;55;0;7;0;0;0;1;0;1;1;0;0 -NVIDIA GH200 480GB [0x3528];3;55;29;16;30000;0;29;8;1;35;55;0;-1;0;1;0;1;0;1;1;0;0 -NVIDIA GH200 480GB [0x3528];3;55;29;29;30000;0;57;8;1;45;55;-2;-2;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;55;29;55;30000;0;7;16;1;17;55;-1;1;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;55;55;14;30000;0;26;55;1;15;55;-2;4;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;55;55;16;30000;0;38;16;1;16;55;0;3;0;1;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;55;55;29;30000;0;23;55;1;17;55;1;0;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;55;55;55;30000;0;13;55;1;5;55;0;0;0;0;0;1;0;1;2;0;0 -NVIDIA GH200 480GB [0x3528];3;64;64;64;30000;0;5;64;1;18;64;0;6;0;0;0;1;0;1;0;0;0 -NVIDIA GH200 480GB [0x3528];3;78;78;78;30000;0;61;78;1;6;78;-2;0;0;1;0;1;0;1;2;0;0 diff --git a/src/acc/opencl/smm/params/tune_multiply_H100.csv b/src/acc/opencl/smm/params/tune_multiply_H100.csv deleted file mode 100644 index 6959b153a65..00000000000 --- a/src/acc/opencl/smm/params/tune_multiply_H100.csv +++ /dev/null @@ -1,296 +0,0 @@ -DEVICE;TYPEID;M;N;K;S;GFLOPS;BS;BM;BN;BK;WS;WG;LU;NZ;AL;TB;TC;AP;AA;AB;AC -NVIDIA H100 PCIe [0xa32d];3;2;2;2;30000;0;11;2;1;1;1;-2;0;0;1;1;1;0;2;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;3;3;3;30000;0;14;3;1;3;1;-1;-1;0;1;0;1;0;0;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;4;4;4;30000;0;17;4;1;4;1;1;-1;0;1;0;1;0;0;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;4;4;5;30000;0;14;4;1;1;1;1;-1;0;0;0;1;0;2;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;4;4;7;30000;0;16;4;1;1;1;-2;-2;1;1;1;1;0;2;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;4;4;9;30000;0;6;4;1;2;1;0;-2;0;1;1;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;4;4;10;30000;0;5;4;1;4;1;-1;0;1;0;1;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;4;4;13;30000;0;6;4;1;4;1;-1;-2;1;1;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;4;4;15;30000;0;14;4;1;4;1;-1;-1;0;0;0;0;0;0;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;4;4;17;30000;0;6;4;1;2;1;1;-2;0;1;0;1;1;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;4;4;25;30000;0;6;4;1;2;1;-1;1;1;1;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;4;4;26;30000;0;6;4;1;4;1;-1;0;0;0;0;1;1;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;4;4;28;30000;0;6;4;1;4;1;0;0;0;1;0;1;1;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;4;4;32;30000;0;6;4;1;4;1;-1;-2;0;0;0;1;1;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;4;5;4;30000;0;15;4;1;2;1;-2;-1;0;1;1;1;0;2;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;4;5;5;30000;0;14;4;1;3;1;-2;-1;1;1;1;1;0;0;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;4;5;7;30000;0;15;4;1;1;1;0;0;0;0;0;1;0;2;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;4;5;9;30000;0;12;4;1;1;1;-1;0;1;1;0;1;0;0;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;4;5;13;30000;0;6;4;1;4;1;0;-2;0;0;0;1;1;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;4;5;17;30000;0;6;4;1;3;1;1;-2;0;1;0;1;0;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;4;5;25;30000;0;6;4;1;4;1;0;2;1;0;0;1;0;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;4;5;32;30000;0;3;4;1;3;1;0;0;1;1;0;1;0;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;4;7;4;30000;0;17;4;1;2;1;-1;0;0;1;1;1;0;0;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;4;7;5;30000;0;14;4;1;4;1;1;0;1;1;1;1;0;2;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;4;7;7;30000;0;15;4;1;1;1;-1;0;0;0;0;1;0;2;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;4;7;9;30000;0;15;4;1;2;1;0;-2;0;1;0;1;0;0;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;4;7;13;30000;0;14;4;1;2;1;0;0;0;0;0;1;0;2;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;4;9;4;30000;0;15;4;1;2;1;-2;-2;0;1;0;1;0;2;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;4;9;5;30000;0;12;4;1;2;1;-2;-1;0;1;1;1;0;2;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;4;9;7;30000;0;15;4;1;2;1;-2;0;1;1;0;1;0;2;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;4;9;9;30000;0;12;4;1;3;1;1;-1;0;0;0;1;0;0;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;4;9;13;30000;0;6;4;1;2;1;-2;-1;0;0;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;4;10;4;30000;0;18;4;1;4;1;-2;-1;0;1;1;1;0;0;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;4;10;10;30000;0;11;4;1;3;1;1;-2;1;0;0;1;0;0;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;4;13;4;30000;0;17;4;1;3;1;0;-1;0;0;1;1;0;0;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;4;13;5;30000;0;15;4;1;3;1;-2;0;1;0;1;1;0;2;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;4;13;7;30000;0;14;4;1;2;1;-1;2;0;0;0;1;0;2;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;4;13;9;30000;0;14;4;1;4;1;-2;0;0;0;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;4;13;13;30000;0;6;4;1;3;1;1;-2;0;0;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;4;13;17;30000;0;6;4;1;4;1;-1;0;0;0;1;1;0;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;4;13;32;30000;0;12;4;1;2;1;-1;1;1;0;0;1;0;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;4;15;4;30000;0;19;4;1;2;1;1;1;0;1;1;1;0;2;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;4;17;4;30000;0;17;4;1;3;1;-2;-2;0;0;0;1;0;2;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;4;17;5;30000;0;18;4;1;3;1;-2;-1;0;1;0;1;1;2;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;4;17;13;30000;0;14;4;1;2;1;1;2;1;1;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;4;17;17;30000;0;12;4;1;4;1;-2;-2;0;0;0;1;0;0;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;4;17;32;30000;0;15;4;1;2;1;-1;-2;1;1;0;1;0;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;4;25;4;30000;0;17;4;1;1;1;1;0;1;0;1;1;0;2;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;4;25;5;30000;0;14;4;1;4;25;0;0;0;0;0;1;0;2;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;4;26;4;30000;0;19;4;1;1;1;0;-1;1;0;1;1;1;0;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;4;28;4;30000;0;20;4;1;3;1;-1;-1;0;1;1;1;1;2;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;4;32;4;30000;0;19;4;1;1;1;0;-2;1;0;0;1;0;2;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;4;32;5;30000;0;18;4;1;1;1;0;-2;0;1;1;1;1;0;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;4;32;13;30000;0;12;4;1;2;1;-1;1;0;1;0;1;0;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;4;32;17;30000;0;12;4;1;2;1;0;4;0;0;0;1;1;1;0;1;0 -NVIDIA H100 PCIe [0xa32d];3;4;32;32;30000;0;15;4;1;4;1;0;1;0;0;0;1;0;1;2;1;0 -NVIDIA H100 PCIe [0xa32d];3;5;4;4;30000;0;17;5;1;3;1;-2;-1;1;0;1;1;0;2;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;5;4;5;30000;0;14;5;1;2;1;-1;1;0;0;0;1;0;0;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;5;4;7;30000;0;14;5;1;2;1;-1;-1;1;0;0;1;0;2;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;5;4;9;30000;0;14;5;1;4;1;1;0;0;0;0;1;0;2;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;5;4;13;30000;0;11;5;1;2;5;0;-2;0;1;0;1;0;2;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;5;4;17;30000;0;11;5;1;2;5;0;3;0;0;0;0;0;2;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;5;4;25;30000;0;15;5;1;5;5;0;0;0;1;1;0;1;2;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;5;4;32;30000;0;12;5;1;5;5;-1;0;0;0;1;1;0;2;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;5;5;4;30000;0;15;5;1;2;1;1;-2;0;1;1;1;0;0;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;5;5;5;30000;0;14;5;1;5;1;1;-2;0;0;0;1;0;0;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;5;5;7;30000;0;6;5;1;5;1;0;-2;1;0;1;1;1;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;5;5;9;30000;0;5;5;1;2;1;0;-2;1;0;0;1;1;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;5;5;13;30000;0;5;5;1;4;1;1;-2;1;1;1;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;5;5;17;30000;0;6;5;1;5;1;-2;-2;0;0;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;5;5;32;30000;0;6;5;1;4;1;-2;0;1;0;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;5;7;4;30000;0;16;5;1;2;1;0;-1;0;0;1;1;0;2;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;5;7;5;30000;0;14;5;1;3;1;-2;-2;0;1;0;1;0;0;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;5;7;7;30000;0;5;5;1;4;1;-2;-1;0;0;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;5;7;9;30000;0;12;5;1;2;1;-2;0;0;1;0;1;0;0;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;5;7;13;30000;0;6;5;1;5;1;-2;-1;0;1;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;5;9;4;30000;0;18;5;1;2;1;-1;4;0;0;0;1;0;2;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;5;9;5;30000;0;14;5;1;3;1;-1;0;0;1;1;1;0;2;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;5;9;7;30000;0;14;5;1;1;1;1;0;0;0;1;1;0;0;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;5;9;9;30000;0;10;5;1;2;1;1;2;0;0;1;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;5;13;4;30000;0;21;5;1;2;1;-1;-1;0;1;0;1;0;0;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;5;13;5;30000;0;15;5;1;1;1;1;-1;0;0;0;1;0;0;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;5;13;7;30000;0;14;5;1;1;1;0;-2;1;0;1;1;0;2;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;5;13;13;30000;0;10;5;1;4;1;1;0;0;0;1;1;1;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;5;13;17;30000;0;10;5;1;4;1;-2;0;0;0;1;1;1;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;5;13;32;30000;0;5;5;1;5;1;-1;-2;0;1;0;1;0;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;5;17;4;30000;0;17;5;1;4;1;-1;-2;1;0;0;1;0;2;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;5;17;5;30000;0;16;5;1;4;1;1;0;0;1;1;1;0;2;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;5;17;13;30000;0;10;5;1;4;1;-1;-1;0;0;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;5;17;17;30000;0;11;5;1;3;1;-1;-1;0;0;0;1;0;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;5;17;32;30000;0;10;5;1;4;1;1;-2;0;0;1;1;1;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;5;25;4;30000;0;21;5;1;3;1;-1;0;1;0;1;1;0;2;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;5;32;4;30000;0;19;5;1;2;1;-2;1;1;0;1;1;0;0;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;5;32;5;30000;0;18;5;1;4;1;-2;-2;1;0;1;1;1;2;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;5;32;13;30000;0;12;5;1;3;1;0;-1;1;1;0;1;0;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;5;32;17;30000;0;12;5;1;3;1;0;-2;0;0;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;5;32;32;30000;0;15;5;1;5;1;0;-2;0;0;0;1;0;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;6;6;6;30000;0;6;6;1;5;1;1;0;0;1;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;6;6;7;30000;0;11;6;1;2;1;-1;-2;0;1;1;1;0;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;6;6;8;30000;0;10;6;1;3;1;0;1;1;0;1;1;1;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;6;7;6;30000;0;6;6;1;5;1;1;0;0;0;0;1;1;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;6;7;7;30000;0;10;6;1;3;1;-2;-1;0;0;1;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;6;7;8;30000;0;15;6;1;6;1;-2;-1;0;1;0;1;0;0;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;6;8;6;30000;0;10;6;1;3;1;1;-1;0;0;0;1;1;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;6;8;7;30000;0;10;6;1;5;1;1;0;0;1;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;6;8;8;30000;0;6;6;1;3;1;-1;-1;0;0;0;1;1;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;7;4;4;30000;0;15;7;1;1;1;0;0;0;0;0;1;0;2;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;7;4;5;30000;0;11;7;1;2;1;0;3;0;1;1;1;0;0;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;7;4;7;30000;0;14;7;1;7;1;-2;-1;0;0;0;1;0;0;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;7;4;9;30000;0;11;7;1;3;1;1;2;0;1;0;1;0;2;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;7;4;13;30000;0;11;7;1;6;7;0;-2;0;1;0;1;0;2;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;7;5;4;30000;0;15;7;1;1;1;-1;-2;0;1;0;1;0;0;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;7;5;5;30000;0;11;7;1;1;1;-2;0;0;0;0;1;0;2;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;7;5;7;30000;0;14;7;1;4;7;0;0;0;0;0;1;0;0;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;7;5;9;30000;0;11;7;1;2;1;1;-1;0;0;1;1;0;0;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;7;5;13;30000;0;12;7;1;2;1;1;-2;0;0;1;1;0;2;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;7;6;6;30000;0;15;7;1;2;1;-2;0;0;1;1;1;0;0;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;7;6;7;30000;0;15;7;1;2;1;0;4;0;0;0;1;0;2;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;7;6;8;30000;0;14;7;1;2;1;-2;0;0;1;1;1;0;2;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;7;7;4;30000;0;9;7;1;3;1;-1;1;0;0;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;7;7;5;30000;0;10;7;1;7;1;-2;-1;1;0;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;7;7;6;30000;0;10;7;1;3;1;-1;2;1;0;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;7;7;7;30000;0;14;7;1;4;1;1;-2;0;1;0;1;1;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;7;7;8;30000;0;22;7;1;6;1;-2;0;0;0;0;1;0;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;7;7;9;30000;0;14;7;1;2;1;0;2;1;0;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;7;7;13;30000;0;10;7;1;3;1;-1;-2;0;1;1;1;1;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;7;8;6;30000;0;10;7;1;2;1;0;-1;0;0;0;1;1;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;7;8;7;30000;0;10;7;1;2;1;1;4;0;0;1;1;1;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;7;8;8;30000;0;11;7;1;5;1;-1;-2;0;1;0;1;0;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;7;9;4;30000;0;15;7;1;3;1;-2;-2;0;0;0;1;0;0;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;7;9;5;30000;0;10;7;1;2;1;1;1;0;1;0;1;1;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;7;9;7;30000;0;14;7;1;4;1;-1;-2;1;1;1;1;1;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;7;13;4;30000;0;17;7;1;6;1;0;-2;0;1;0;1;0;0;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;7;13;5;30000;0;11;7;1;2;1;1;-1;1;0;0;1;0;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;7;13;7;30000;0;14;7;1;2;1;1;-1;1;0;1;1;1;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;7;13;13;30000;0;14;7;1;6;1;-2;-1;0;1;1;1;1;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;8;6;6;30000;0;11;8;1;1;1;0;-2;0;1;1;1;0;2;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;8;6;7;30000;0;15;8;1;4;1;1;-1;0;0;0;1;0;2;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;8;6;8;30000;0;11;8;1;3;1;-1;-1;0;0;0;1;0;2;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;8;7;6;30000;0;14;8;1;4;1;-1;-1;0;0;0;1;0;2;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;8;7;7;30000;0;14;8;1;5;1;-2;-2;0;1;0;1;0;2;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;8;7;8;30000;0;14;8;1;5;1;-1;0;0;1;1;1;0;2;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;8;8;6;30000;0;10;8;1;2;1;1;1;1;0;1;1;1;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;8;8;7;30000;0;14;8;1;4;1;-1;-1;0;0;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;8;8;8;30000;0;14;8;1;6;1;0;-1;0;0;1;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;9;4;4;30000;0;16;9;1;4;1;0;1;0;0;1;1;0;2;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;9;4;5;30000;0;11;9;1;1;1;-1;0;0;0;1;1;0;0;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;9;4;7;30000;0;11;9;1;4;1;-1;0;0;1;1;1;0;2;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;9;4;9;30000;0;11;8;1;9;9;1;-1;0;0;1;1;0;2;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;9;4;13;30000;0;11;9;1;7;9;-1;-2;0;1;0;1;0;2;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;9;5;4;30000;0;15;9;1;1;1;-2;-2;0;0;0;1;0;2;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;9;5;5;30000;0;14;9;1;7;1;-1;-1;0;0;1;1;0;0;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;9;5;7;30000;0;11;8;1;2;9;0;-1;0;1;1;1;0;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;9;5;9;30000;0;15;9;1;5;1;1;-2;0;0;0;1;1;2;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;9;7;4;30000;0;14;9;1;2;1;-2;1;0;1;1;1;0;2;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;9;7;5;30000;0;10;8;1;9;1;1;0;0;0;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;9;7;7;30000;0;11;8;1;5;1;1;2;0;0;0;1;1;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;9;9;4;30000;0;17;9;1;7;1;-1;-2;0;0;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;9;9;5;30000;0;22;9;1;4;1;-1;-1;1;0;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;9;9;9;30000;0;18;9;1;5;1;1;-1;0;1;0;1;1;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;9;9;16;30000;0;22;9;1;9;1;1;-1;0;1;1;1;1;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;9;9;22;30000;0;6;9;1;3;1;-2;-2;0;1;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;9;9;32;30000;0;22;9;1;7;1;0;-2;0;0;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;9;13;4;30000;0;14;9;1;4;1;-2;-1;1;0;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;9;16;9;30000;0;17;9;1;7;1;0;-1;1;0;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;9;16;16;30000;0;10;9;1;4;1;-2;3;1;1;0;1;1;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;9;16;22;30000;0;10;9;1;2;1;1;1;0;0;0;1;1;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;9;22;9;30000;0;18;9;1;6;1;0;0;1;0;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;9;22;16;30000;0;12;9;1;3;1;-2;0;1;0;1;1;1;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;9;22;22;30000;0;13;9;1;7;1;-1;0;1;1;0;1;1;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;9;22;32;30000;0;24;9;1;8;1;-1;-1;1;0;0;1;0;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;10;4;4;30000;0;15;10;1;6;1;0;0;0;1;0;1;0;0;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;10;4;10;30000;0;11;8;1;3;10;-2;3;0;0;1;1;0;0;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;10;10;4;30000;0;14;10;1;9;1;1;-1;1;1;0;1;1;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;10;10;10;30000;0;17;10;1;3;1;1;-1;0;1;1;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;13;4;4;30000;0;9;8;1;13;1;1;0;0;1;1;1;0;2;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;13;4;5;30000;0;10;8;1;6;13;0;2;0;1;1;1;0;0;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;13;4;7;30000;0;11;8;1;12;1;-2;6;0;0;1;1;0;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;13;4;9;30000;0;6;8;1;11;13;-2;1;0;0;1;1;1;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;13;4;13;30000;0;6;8;1;4;13;-1;6;0;1;1;1;1;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;13;4;17;30000;0;6;8;1;10;13;1;4;0;1;0;1;1;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;13;4;32;30000;0;17;8;1;6;1;0;-1;0;0;0;1;1;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;13;5;4;30000;0;9;8;1;5;1;-2;3;0;1;0;1;0;2;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;13;5;5;30000;0;9;8;1;7;1;0;2;0;1;1;1;0;2;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;13;5;7;30000;0;11;8;1;10;1;1;1;1;0;0;1;1;0;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;13;5;13;30000;0;10;8;1;4;13;1;4;0;1;1;1;1;2;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;13;5;17;30000;0;10;8;1;4;1;-2;0;0;0;1;1;1;0;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;13;5;32;30000;0;6;8;1;9;1;1;-2;0;0;1;1;1;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;13;7;4;30000;0;11;8;1;2;1;1;2;0;0;0;1;0;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;13;7;5;30000;0;14;13;1;10;1;1;3;0;0;1;1;1;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;13;7;7;30000;0;14;8;1;13;1;-1;3;1;1;1;1;1;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;13;7;13;30000;0;14;8;1;2;1;-1;1;0;1;1;1;1;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;13;9;4;30000;0;14;8;1;11;1;1;2;0;0;0;1;1;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;13;13;4;30000;0;25;13;1;10;1;0;-2;0;0;0;1;0;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;13;13;5;30000;0;22;13;1;12;1;-2;-1;1;0;1;1;1;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;13;13;7;30000;0;18;13;1;3;13;-2;-2;1;1;1;1;1;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;13;13;13;30000;0;5;13;1;4;1;0;-2;0;1;0;1;1;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;13;13;17;30000;0;17;13;1;10;1;1;0;0;0;1;1;1;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;13;13;32;30000;0;24;13;1;7;1;-2;-1;1;0;0;1;0;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;13;17;4;30000;0;18;13;1;10;1;1;-1;1;0;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;13;17;5;30000;0;17;13;1;2;1;1;-1;1;1;0;1;1;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;13;17;13;30000;0;18;13;1;9;1;1;0;1;0;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;13;17;17;30000;0;17;13;1;2;1;-2;1;0;0;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;13;17;32;30000;0;22;13;1;12;1;1;-2;0;0;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;13;32;4;30000;0;25;13;1;13;1;-2;-2;1;1;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;13;32;5;30000;0;26;13;1;11;1;1;-1;1;0;0;1;0;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;13;32;13;30000;0;22;13;1;13;1;1;-2;0;0;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;13;32;17;30000;0;25;8;1;4;1;0;4;0;0;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;13;32;32;30000;0;15;13;1;11;1;-1;-1;1;0;0;1;0;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;15;4;4;30000;0;9;8;1;11;1;0;2;1;0;0;1;0;2;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;15;15;15;30000;0;12;15;1;9;1;-2;-1;0;0;1;1;0;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;16;9;9;30000;0;14;8;1;9;1;0;4;0;0;0;1;0;2;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;16;9;16;30000;0;14;8;1;2;16;-2;5;0;1;1;1;1;1;2;1;0 -NVIDIA H100 PCIe [0xa32d];3;16;9;22;30000;0;15;8;1;6;16;1;0;0;1;0;1;0;0;2;1;0 -NVIDIA H100 PCIe [0xa32d];3;16;16;9;30000;0;18;16;1;8;1;0;0;1;0;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;16;16;16;30000;0;13;16;1;3;1;1;-1;0;0;0;1;1;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;16;16;22;30000;0;24;16;1;10;1;-2;-1;1;0;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;16;22;9;30000;0;17;16;1;10;1;1;-1;1;0;0;1;0;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;16;22;16;30000;0;18;16;1;9;1;0;-2;1;0;1;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;16;22;22;30000;0;15;16;1;12;1;0;0;0;0;1;1;0;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;17;4;4;30000;0;9;8;1;11;1;-1;-1;0;1;1;1;0;0;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;17;4;5;30000;0;13;8;1;4;1;-2;6;0;1;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;17;4;13;30000;0;10;8;1;5;17;1;0;0;1;0;1;0;0;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;17;4;17;30000;0;12;8;1;5;17;-1;1;0;1;1;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;17;4;32;30000;0;3;8;1;10;17;0;3;0;1;0;1;0;1;0;1;0 -NVIDIA H100 PCIe [0xa32d];3;17;5;4;30000;0;14;8;1;16;1;-1;-1;0;0;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;17;5;5;30000;0;10;17;1;16;17;-2;4;0;0;1;1;1;0;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;17;5;13;30000;0;11;8;1;5;17;0;-2;0;0;0;1;0;2;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;17;5;17;30000;0;15;8;1;15;17;-2;0;0;1;0;1;0;0;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;17;5;32;30000;0;20;8;1;13;17;-2;6;1;1;0;1;1;2;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;17;13;4;30000;0;15;17;1;13;1;1;-2;0;0;0;1;0;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;17;13;5;30000;0;18;17;1;8;1;-2;-2;0;0;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;17;13;13;30000;0;19;8;1;14;1;-1;4;1;1;0;1;1;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;17;13;17;30000;0;10;17;1;12;1;-1;-2;1;0;0;1;1;1;2;1;0 -NVIDIA H100 PCIe [0xa32d];3;17;13;32;30000;0;22;17;1;14;1;-1;0;1;1;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;17;17;4;30000;0;24;17;1;14;1;-2;-2;0;0;1;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;17;17;5;30000;0;24;17;1;11;1;0;0;0;0;0;1;0;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;17;17;13;30000;0;18;17;1;16;1;1;0;0;0;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;17;17;17;30000;0;22;17;1;9;1;-1;-1;0;0;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;17;17;32;30000;0;11;17;1;15;1;1;-1;0;1;0;1;0;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;17;32;4;30000;0;22;17;1;16;1;-2;-2;1;1;1;1;0;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;17;32;5;30000;0;26;17;1;2;1;1;-2;0;0;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;17;32;13;30000;0;12;17;1;9;1;-1;0;1;0;0;1;0;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;17;32;17;30000;0;22;17;1;13;1;-2;-2;1;0;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;17;32;32;30000;0;24;17;1;17;1;-2;-1;0;0;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;20;20;20;30000;0;22;20;1;18;1;1;-2;1;0;1;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;22;9;9;30000;0;12;8;1;7;1;-1;4;0;0;1;1;0;2;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;22;9;16;30000;0;18;8;1;15;1;-2;5;0;1;1;1;1;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;22;9;22;30000;0;20;22;1;13;22;-1;5;0;1;0;1;1;2;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;22;9;32;30000;0;20;8;1;18;22;-1;3;0;0;0;1;0;0;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;22;16;9;30000;0;22;8;1;5;1;-1;5;0;1;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;22;16;16;30000;0;22;8;1;8;1;-1;3;0;1;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;22;16;22;30000;0;34;8;1;12;1;1;6;0;0;1;1;1;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;22;22;9;30000;0;17;22;1;11;0;-2;-1;1;0;0;1;1;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;22;22;16;30000;0;24;22;1;11;1;0;-1;0;1;0;1;0;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;22;22;22;30000;0;24;22;1;15;0;-1;-2;0;0;1;1;0;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;22;22;32;30000;0;22;22;1;17;1;0;-1;1;0;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;23;23;23;30000;0;22;23;1;20;1;1;-2;0;0;0;1;1;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;24;24;24;30000;0;24;24;1;22;0;-2;-2;0;0;1;1;1;1;0;1;0 -NVIDIA H100 PCIe [0xa32d];3;25;4;4;30000;0;10;8;1;8;25;1;4;0;0;1;1;1;2;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;25;4;5;30000;0;9;25;1;11;25;-1;6;0;1;0;1;1;0;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;25;5;4;30000;0;9;8;1;21;1;-1;1;0;0;1;1;0;0;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;25;25;25;30000;0;25;25;1;2;1;-1;-1;1;0;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;26;4;4;30000;0;9;8;1;26;26;-2;4;1;0;1;1;0;0;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;28;4;4;30000;0;13;8;1;20;1;-2;5;0;1;0;1;0;0;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;28;28;28;30000;0;24;28;1;19;0;0;0;0;0;1;1;0;1;0;1;0 -NVIDIA H100 PCIe [0xa32d];3;30;30;30;30000;0;25;30;1;18;1;0;0;1;0;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;32;4;4;30000;0;11;8;1;15;32;1;4;1;1;0;1;1;0;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;32;4;5;30000;0;16;8;1;32;32;1;6;1;0;1;1;0;0;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;32;4;13;30000;0;12;8;1;11;32;1;4;0;1;0;1;0;0;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;32;4;17;30000;0;13;8;1;24;32;0;4;0;0;1;1;1;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;32;4;32;30000;0;24;8;1;29;32;-2;5;0;1;0;1;1;0;0;1;0 -NVIDIA H100 PCIe [0xa32d];3;32;5;4;30000;0;18;8;1;26;1;1;4;0;0;1;1;1;2;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;32;5;5;30000;0;18;8;1;14;1;0;4;1;0;0;1;0;2;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;32;5;13;30000;0;11;8;1;27;32;-2;6;0;1;1;1;0;0;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;32;5;17;30000;0;22;8;1;16;32;-2;0;0;0;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;32;5;32;30000;0;24;32;1;9;32;-1;6;0;0;1;1;1;2;0;1;0 -NVIDIA H100 PCIe [0xa32d];3;32;13;4;30000;0;24;8;1;1;1;-2;6;1;1;0;1;1;0;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;32;13;5;30000;0;22;8;1;10;1;0;6;1;0;0;1;1;2;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;32;13;13;30000;0;20;8;1;18;1;1;5;0;1;0;1;0;0;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;32;13;17;30000;0;22;8;1;9;1;-1;6;0;0;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;32;13;32;30000;0;11;8;1;16;1;-1;1;0;1;0;1;0;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;32;17;4;30000;0;22;32;1;5;1;-2;0;0;0;0;1;1;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;32;17;5;30000;0;22;32;1;9;0;-1;1;0;0;1;1;1;1;0;0;0 -NVIDIA H100 PCIe [0xa32d];3;32;17;13;30000;0;22;32;1;22;0;-1;0;0;0;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;32;17;17;30000;0;22;32;1;7;0;0;1;1;0;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;32;17;32;30000;0;22;32;1;28;1;-1;0;0;1;1;1;1;1;1;0;0 -NVIDIA H100 PCIe [0xa32d];3;32;32;4;30000;0;33;32;1;10;0;1;1;0;0;1;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;32;32;5;30000;0;33;32;1;11;0;0;-1;1;0;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;32;32;13;30000;0;34;32;1;7;1;0;1;0;0;0;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;32;32;17;30000;0;24;32;1;28;1;0;-1;1;0;1;1;0;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;32;32;32;30000;0;25;32;1;29;1;-1;-2;1;0;1;1;1;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;35;35;35;30000;0;22;35;1;23;1;1;0;0;0;0;1;0;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;36;36;36;30000;0;22;36;1;23;0;0;0;0;0;0;1;0;1;2;0;0 -NVIDIA H100 PCIe [0xa32d];3;40;40;40;30000;0;44;40;1;22;1;-1;0;0;0;0;1;0;1;2;0;0 diff --git a/src/acc/opencl/smm/params/tune_multiply_Mi250.csv b/src/acc/opencl/smm/params/tune_multiply_Mi250.csv deleted file mode 100644 index d26408d96d6..00000000000 --- a/src/acc/opencl/smm/params/tune_multiply_Mi250.csv +++ /dev/null @@ -1,365 +0,0 @@ -DEVICE;TYPEID;M;N;K;S;GFLOPS;BS;BM;BN;BK;WS;WG;LU;NZ;AL;TB;TC;AP;AA;AB;AC -gfx90a [0x989f];3;1;1;1;30000;0;8;1;1;1;1;1;0;0;0;0;1;0;2;2;0;0 -gfx90a [0x989f];3;3;3;3;30000;0;10;3;1;3;1;-1;0;0;1;1;1;0;2;0;0;0 -gfx90a [0x989f];3;3;3;4;30000;0;25;3;1;2;1;0;-2;0;0;0;1;0;0;2;0;0 -gfx90a [0x989f];3;3;3;5;30000;0;29;3;1;2;1;-1;-2;0;1;0;1;0;2;2;1;0 -gfx90a [0x989f];3;3;3;6;30000;0;29;3;1;2;1;-2;-2;0;1;1;1;0;0;0;0;0 -gfx90a [0x989f];3;3;3;7;30000;0;29;3;1;2;1;-1;0;0;1;1;1;0;2;2;1;0 -gfx90a [0x989f];3;3;3;8;30000;0;9;3;1;2;1;-2;-1;0;0;0;1;0;2;0;0;0 -gfx90a [0x989f];3;3;3;9;30000;0;9;3;1;2;1;-2;0;0;0;0;1;0;2;2;0;0 -gfx90a [0x989f];3;3;3;10;30000;0;37;3;1;1;1;0;0;0;0;0;1;0;2;2;0;0 -gfx90a [0x989f];3;3;3;11;30000;0;8;3;1;3;1;1;-2;0;0;0;1;0;2;2;0;0 -gfx90a [0x989f];3;3;3;12;30000;0;6;3;1;3;1;-2;-2;0;0;0;1;0;2;0;0;0 -gfx90a [0x989f];3;3;3;16;30000;0;9;3;1;1;1;1;-1;0;0;0;1;0;2;2;0;0 -gfx90a [0x989f];3;3;3;23;30000;0;3;3;1;1;1;-1;-2;0;0;0;1;0;2;2;0;0 -gfx90a [0x989f];3;3;4;3;30000;0;21;3;1;1;1;0;-1;0;0;0;1;0;2;0;0;0 -gfx90a [0x989f];3;3;4;4;30000;0;25;3;1;2;1;0;-2;0;0;0;1;0;0;2;0;0 -gfx90a [0x989f];3;3;5;3;30000;0;18;3;1;1;1;1;-2;0;0;0;1;0;0;2;0;0 -gfx90a [0x989f];3;3;5;5;30000;0;25;3;1;2;1;-1;-2;0;0;0;1;0;2;2;0;0 -gfx90a [0x989f];3;3;6;3;30000;0;15;3;1;1;1;1;0;0;0;0;1;0;0;0;0;0 -gfx90a [0x989f];3;3;6;6;30000;0;25;3;1;3;1;-1;-2;0;0;0;1;0;2;0;0;0 -gfx90a [0x989f];3;3;7;3;30000;0;15;3;1;2;1;-1;0;0;0;0;1;0;0;0;0;0 -gfx90a [0x989f];3;3;7;7;30000;0;29;3;1;1;1;-1;0;0;0;0;1;0;0;0;0;0 -gfx90a [0x989f];3;3;8;3;30000;0;15;3;1;2;1;1;-1;0;0;0;1;0;2;2;0;0 -gfx90a [0x989f];3;3;8;8;30000;0;29;3;1;1;1;0;0;0;0;0;1;0;2;0;0;0 -gfx90a [0x989f];3;3;9;3;30000;0;15;3;1;1;1;-1;-2;0;0;0;1;0;0;0;0;0 -gfx90a [0x989f];3;3;9;9;30000;0;25;3;1;3;1;0;-2;0;1;1;1;0;0;2;1;0 -gfx90a [0x989f];3;3;10;3;30000;0;15;3;1;1;1;-2;-2;0;0;0;1;0;2;2;0;0 -gfx90a [0x989f];3;3;10;10;30000;0;25;3;1;1;1;0;-2;0;0;1;1;0;2;2;0;0 -gfx90a [0x989f];3;3;11;3;30000;0;15;3;1;3;1;0;-2;0;0;0;1;0;0;0;0;0 -gfx90a [0x989f];3;3;11;11;30000;0;30;3;1;1;1;1;0;0;0;0;1;0;2;2;0;0 -gfx90a [0x989f];3;3;12;3;30000;0;15;3;1;1;1;-1;-2;0;0;0;1;0;0;2;0;0 -gfx90a [0x989f];3;3;12;12;30000;0;25;3;1;2;1;-2;-1;0;0;0;1;0;2;1;0;0 -gfx90a [0x989f];3;3;16;3;30000;0;15;3;1;2;1;0;0;0;0;0;1;0;2;2;0;0 -gfx90a [0x989f];3;3;16;16;30000;0;40;3;1;1;1;-2;0;0;0;0;1;0;0;0;0;0 -gfx90a [0x989f];3;3;23;3;30000;0;15;3;1;3;1;0;0;0;0;0;1;0;0;2;0;0 -gfx90a [0x989f];3;3;23;23;30000;0;50;3;1;3;1;-1;0;0;1;0;1;1;0;0;1;0 -gfx90a [0x989f];3;4;3;3;30000;0;18;4;1;3;1;1;-2;0;0;0;1;0;2;2;0;0 -gfx90a [0x989f];3;4;3;4;30000;0;25;4;1;2;1;-1;-1;0;0;0;1;0;2;0;0;0 -gfx90a [0x989f];3;4;4;3;30000;0;21;4;1;2;1;-2;-2;0;0;0;1;0;2;2;0;0 -gfx90a [0x989f];3;4;4;4;30000;0;16;4;1;2;1;1;3;1;1;1;1;0;0;0;0;0 -gfx90a [0x989f];3;4;4;5;30000;0;9;4;1;2;1;-1;-2;0;0;0;1;0;0;0;0;0 -gfx90a [0x989f];3;4;4;6;30000;0;29;4;1;3;1;0;0;0;0;0;1;0;2;0;0;0 -gfx90a [0x989f];3;4;4;7;30000;0;29;4;1;2;1;-1;-2;0;0;0;1;0;0;0;0;0 -gfx90a [0x989f];3;4;4;8;30000;0;9;4;1;2;1;-2;0;0;0;0;1;0;2;0;0;0 -gfx90a [0x989f];3;4;4;9;30000;0;25;4;1;3;1;1;-1;0;0;0;1;0;2;2;0;0 -gfx90a [0x989f];3;4;4;10;30000;0;25;4;1;2;1;0;-1;0;0;0;1;0;2;2;0;0 -gfx90a [0x989f];3;4;4;11;30000;0;25;4;1;4;1;0;-1;0;0;0;1;0;0;0;0;0 -gfx90a [0x989f];3;4;4;12;30000;0;29;4;1;4;1;1;-2;0;0;0;1;0;0;2;0;0 -gfx90a [0x989f];3;4;4;16;30000;0;4;4;1;2;1;-1;-1;0;1;0;1;0;0;0;0;0 -gfx90a [0x989f];3;4;4;23;30000;0;30;4;1;3;1;0;0;0;1;0;1;0;0;2;1;0 -gfx90a [0x989f];3;4;5;4;30000;0;25;4;1;2;1;0;3;0;0;0;1;0;2;2;0;0 -gfx90a [0x989f];3;4;5;5;30000;0;25;4;1;1;1;-1;0;0;0;0;1;0;2;0;0;0 -gfx90a [0x989f];3;4;6;4;30000;0;21;4;1;2;1;-1;1;0;1;1;1;0;0;2;0;0 -gfx90a [0x989f];3;4;6;6;30000;0;25;4;1;3;1;1;-2;0;0;0;1;0;2;0;0;0 -gfx90a [0x989f];3;4;7;4;30000;0;21;4;1;1;1;-2;0;0;1;1;1;0;0;0;0;0 -gfx90a [0x989f];3;4;7;7;30000;0;25;4;1;4;1;0;-2;0;1;0;1;0;2;2;1;0 -gfx90a [0x989f];3;4;8;4;30000;0;25;4;1;3;1;1;-1;0;0;0;1;0;0;2;0;0 -gfx90a [0x989f];3;4;8;8;30000;0;9;4;1;2;1;0;-1;0;0;0;1;0;0;2;0;0 -gfx90a [0x989f];3;4;9;4;30000;0;20;4;1;4;1;1;0;0;1;0;1;0;2;0;1;0 -gfx90a [0x989f];3;4;9;9;30000;0;26;4;1;3;1;1;-1;0;0;0;1;0;2;0;0;0 -gfx90a [0x989f];3;4;10;4;30000;0;20;4;1;4;1;0;-1;0;0;0;1;0;0;0;0;0 -gfx90a [0x989f];3;4;10;10;30000;0;25;4;1;2;1;0;0;0;0;0;1;0;0;2;0;0 -gfx90a [0x989f];3;4;11;4;30000;0;18;4;1;1;1;0;-1;0;0;0;1;0;2;0;0;0 -gfx90a [0x989f];3;4;11;11;30000;0;30;4;1;4;1;0;-2;0;0;0;1;0;0;2;0;0 -gfx90a [0x989f];3;4;12;4;30000;0;20;4;1;3;1;-1;-2;0;1;0;1;0;2;2;0;0 -gfx90a [0x989f];3;4;12;12;30000;0;40;4;1;4;1;1;-1;0;1;1;1;1;2;0;1;0 -gfx90a [0x989f];3;4;16;4;30000;0;20;4;1;1;1;1;-1;0;0;0;1;0;2;2;0;0 -gfx90a [0x989f];3;4;16;16;30000;0;30;4;1;1;1;1;-1;0;0;0;1;0;2;2;0;0 -gfx90a [0x989f];3;4;23;4;30000;0;24;4;1;2;1;-2;-2;0;0;0;1;0;0;0;0;0 -gfx90a [0x989f];3;4;23;23;30000;0;25;4;1;1;1;-2;-1;0;0;0;1;0;0;1;0;0 -gfx90a [0x989f];3;5;3;3;30000;0;18;5;1;5;1;0;-2;0;0;0;1;0;2;2;0;0 -gfx90a [0x989f];3;5;3;5;30000;0;12;5;1;2;1;1;0;0;0;0;1;0;2;2;0;0 -gfx90a [0x989f];3;5;4;4;30000;0;24;5;1;4;1;0;0;0;0;0;1;0;0;2;0;0 -gfx90a [0x989f];3;5;4;5;30000;0;9;5;1;5;1;0;-1;0;0;0;1;0;2;0;0;0 -gfx90a [0x989f];3;5;5;3;30000;0;20;5;1;2;1;-1;-2;0;0;0;1;0;2;2;0;0 -gfx90a [0x989f];3;5;5;4;30000;0;9;5;1;2;1;0;-2;0;0;0;1;0;2;0;0;0 -gfx90a [0x989f];3;5;5;5;30000;0;10;5;1;2;1;0;-1;0;1;1;1;1;0;0;0;0 -gfx90a [0x989f];3;5;5;6;30000;0;9;5;1;4;1;-2;-1;0;0;0;1;0;2;0;0;0 -gfx90a [0x989f];3;5;5;7;30000;0;20;5;1;2;1;0;1;0;0;0;1;0;2;0;0;0 -gfx90a [0x989f];3;5;5;8;30000;0;24;5;1;3;1;-1;-1;0;0;0;1;0;2;2;0;0 -gfx90a [0x989f];3;5;5;9;30000;0;25;5;1;5;1;0;0;0;0;0;1;0;0;0;0;0 -gfx90a [0x989f];3;5;5;10;30000;0;25;5;1;2;1;1;-1;0;0;0;1;0;0;0;0;0 -gfx90a [0x989f];3;5;5;11;30000;0;25;5;1;2;1;0;1;0;0;0;1;0;0;0;0;0 -gfx90a [0x989f];3;5;5;12;30000;0;12;5;1;3;1;-2;0;0;1;1;1;0;2;0;0;0 -gfx90a [0x989f];3;5;5;16;30000;0;25;5;1;5;1;1;-2;0;0;0;1;0;0;2;0;0 -gfx90a [0x989f];3;5;5;23;30000;0;30;5;1;3;5;0;-2;0;0;0;1;0;2;0;0;0 -gfx90a [0x989f];3;5;6;5;30000;0;20;5;1;4;1;-1;-2;0;0;0;1;0;2;0;0;0 -gfx90a [0x989f];3;5;6;6;30000;0;9;5;1;5;1;0;-1;0;0;0;1;0;2;0;0;0 -gfx90a [0x989f];3;5;7;5;30000;0;9;5;1;1;1;1;-1;0;0;0;1;0;2;0;0;0 -gfx90a [0x989f];3;5;7;7;30000;0;20;5;1;3;1;0;-2;0;0;0;1;0;2;0;0;0 -gfx90a [0x989f];3;5;8;5;30000;0;12;5;1;5;1;-1;0;0;0;0;1;0;2;0;0;0 -gfx90a [0x989f];3;5;8;8;30000;0;20;5;1;5;1;1;0;0;0;0;1;0;2;0;0;0 -gfx90a [0x989f];3;5;9;5;30000;0;20;5;1;2;1;1;-2;0;0;0;1;0;0;0;0;0 -gfx90a [0x989f];3;5;9;9;30000;0;25;5;1;2;1;1;-2;0;0;0;1;0;0;2;0;0 -gfx90a [0x989f];3;5;10;5;30000;0;20;5;1;4;1;-1;-1;0;0;0;1;0;0;2;0;0 -gfx90a [0x989f];3;5;10;10;30000;0;25;5;1;2;1;-1;0;0;0;0;1;0;0;2;0;0 -gfx90a [0x989f];3;5;11;5;30000;0;20;5;1;5;1;1;0;0;0;0;1;0;2;2;0;0 -gfx90a [0x989f];3;5;11;11;30000;0;25;5;1;3;1;-1;-2;0;0;0;1;0;2;0;0;0 -gfx90a [0x989f];3;5;12;5;30000;0;20;5;1;4;1;-1;0;0;0;0;1;0;0;0;0;0 -gfx90a [0x989f];3;5;12;12;30000;0;25;5;1;5;1;0;-2;0;0;0;1;0;0;0;0;0 -gfx90a [0x989f];3;5;16;5;30000;0;20;5;1;4;1;-1;-2;0;0;0;1;0;2;2;0;0 -gfx90a [0x989f];3;5;16;16;30000;0;26;5;1;4;1;0;-2;0;0;0;1;0;2;0;0;0 -gfx90a [0x989f];3;5;23;5;30000;0;24;5;1;2;1;-2;-2;0;0;0;1;0;0;2;0;0 -gfx90a [0x989f];3;5;23;23;30000;0;24;5;1;1;1;-2;-1;0;0;1;1;1;0;1;0;0 -gfx90a [0x989f];3;6;3;3;30000;0;16;6;1;4;1;-2;-2;0;0;0;1;0;2;2;0;0 -gfx90a [0x989f];3;6;3;6;30000;0;15;6;1;6;1;-1;0;0;0;0;1;0;2;0;0;0 -gfx90a [0x989f];3;6;4;4;30000;0;18;6;1;4;1;-1;-1;0;1;0;1;0;0;0;0;0 -gfx90a [0x989f];3;6;4;6;30000;0;15;6;1;3;1;0;0;0;0;0;1;0;2;2;0;0 -gfx90a [0x989f];3;6;5;5;30000;0;12;6;1;2;1;1;-2;0;0;0;1;0;2;2;0;0 -gfx90a [0x989f];3;6;5;6;30000;0;15;6;1;5;1;-1;0;0;0;0;1;0;2;0;0;0 -gfx90a [0x989f];3;6;6;3;30000;0;15;6;1;3;1;-1;-2;0;0;0;1;0;0;2;0;0 -gfx90a [0x989f];3;6;6;4;30000;0;15;6;1;2;1;-1;-2;0;0;0;1;0;0;2;0;0 -gfx90a [0x989f];3;6;6;5;30000;0;9;6;1;6;1;1;-1;0;0;0;1;0;2;2;0;0 -gfx90a [0x989f];3;6;6;6;30000;0;12;6;1;6;1;-2;-1;0;1;1;1;1;2;0;0;0 -gfx90a [0x989f];3;6;6;7;30000;0;12;6;1;4;1;-1;-1;0;0;0;1;0;2;0;0;0 -gfx90a [0x989f];3;6;6;8;30000;0;20;6;1;4;1;-2;-2;0;1;0;1;0;2;0;0;0 -gfx90a [0x989f];3;6;6;9;30000;0;20;6;1;6;1;0;-2;0;0;0;1;0;2;0;0;0 -gfx90a [0x989f];3;6;6;10;30000;0;15;6;1;1;1;-2;-2;0;0;0;1;0;2;0;0;0 -gfx90a [0x989f];3;6;6;11;30000;0;24;6;1;5;1;-1;0;1;0;1;1;1;2;2;0;0 -gfx90a [0x989f];3;6;6;12;30000;0;20;6;1;6;1;-1;-2;0;0;0;1;0;0;0;0;0 -gfx90a [0x989f];3;6;6;16;30000;0;25;6;1;4;1;0;-2;0;0;0;1;0;2;2;0;0 -gfx90a [0x989f];3;6;6;23;30000;0;15;6;1;1;1;0;-2;0;0;1;1;0;2;2;0;0 -gfx90a [0x989f];3;6;7;6;30000;0;15;6;1;3;1;1;0;0;0;0;1;0;2;2;0;0 -gfx90a [0x989f];3;6;7;7;30000;0;15;6;1;4;1;1;-2;0;0;0;1;0;2;0;0;0 -gfx90a [0x989f];3;6;8;6;30000;0;15;6;1;5;1;-1;-2;0;0;0;1;0;2;0;0;0 -gfx90a [0x989f];3;6;8;8;30000;0;20;6;1;5;1;-2;0;0;0;0;1;0;2;0;0;0 -gfx90a [0x989f];3;6;9;6;30000;0;15;6;1;4;1;-2;0;0;0;0;1;0;2;2;0;0 -gfx90a [0x989f];3;6;9;9;30000;0;9;6;1;1;1;-1;-1;0;0;0;1;0;2;0;0;0 -gfx90a [0x989f];3;6;10;6;30000;0;15;6;1;4;1;-2;-2;0;0;0;1;0;2;0;0;0 -gfx90a [0x989f];3;6;10;10;30000;0;25;6;1;1;1;0;-1;0;1;1;1;1;0;0;0;0 -gfx90a [0x989f];3;6;11;6;30000;0;15;6;1;2;1;-1;0;0;0;0;1;0;2;2;0;0 -gfx90a [0x989f];3;6;11;11;30000;0;25;6;1;1;1;-2;-2;0;1;1;1;1;2;0;0;0 -gfx90a [0x989f];3;6;12;6;30000;0;15;6;1;6;1;-2;-2;0;0;0;1;0;2;2;0;0 -gfx90a [0x989f];3;6;12;12;30000;0;24;6;1;2;1;-2;-1;0;0;0;1;0;2;0;0;0 -gfx90a [0x989f];3;6;16;6;30000;0;20;6;1;6;1;1;-1;1;1;0;1;1;0;0;0;0 -gfx90a [0x989f];3;6;16;16;30000;0;26;6;1;1;1;0;0;1;1;0;1;1;2;2;1;0 -gfx90a [0x989f];3;6;23;6;30000;0;24;6;1;6;1;1;0;1;0;1;1;1;0;0;0;0 -gfx90a [0x989f];3;6;23;23;30000;0;24;6;1;5;1;0;-2;0;0;0;1;0;2;1;0;0 -gfx90a [0x989f];3;7;3;3;30000;0;15;7;1;2;1;-1;-2;0;0;0;1;0;0;2;0;0 -gfx90a [0x989f];3;7;3;7;30000;0;12;7;1;4;1;-2;-2;0;0;0;1;0;2;2;0;0 -gfx90a [0x989f];3;7;4;4;30000;0;15;7;1;3;1;0;-2;0;1;1;1;0;0;2;0;0 -gfx90a [0x989f];3;7;4;7;30000;0;12;7;1;2;1;0;0;0;0;0;1;0;0;0;0;0 -gfx90a [0x989f];3;7;5;5;30000;0;12;7;1;3;1;-1;1;0;0;0;1;0;2;0;0;0 -gfx90a [0x989f];3;7;5;7;30000;0;12;7;1;3;1;1;0;0;0;0;1;0;2;0;0;0 -gfx90a [0x989f];3;7;6;6;30000;0;12;7;1;3;1;-1;1;0;0;0;1;0;0;0;0;0 -gfx90a [0x989f];3;7;6;7;30000;0;12;7;1;2;1;0;-2;0;0;0;1;0;0;0;0;0 -gfx90a [0x989f];3;7;7;3;30000;0;15;7;1;4;1;0;-1;0;1;0;1;0;0;2;0;0 -gfx90a [0x989f];3;7;7;4;30000;0;18;7;1;3;1;1;1;0;0;0;1;1;2;2;0;0 -gfx90a [0x989f];3;7;7;5;30000;0;12;7;1;6;1;1;-2;0;1;1;1;0;2;0;0;0 -gfx90a [0x989f];3;7;7;6;30000;0;15;7;1;6;1;-1;0;0;0;0;1;0;0;2;0;0 -gfx90a [0x989f];3;7;7;7;30000;0;12;7;1;2;1;1;0;0;1;0;1;1;0;0;0;0 -gfx90a [0x989f];3;7;7;8;30000;0;13;7;1;6;1;-1;-2;1;1;1;1;1;0;0;0;0 -gfx90a [0x989f];3;7;7;9;30000;0;15;7;1;1;1;-2;-2;0;0;0;1;0;2;2;0;0 -gfx90a [0x989f];3;7;7;10;30000;0;15;7;1;7;1;-1;-2;0;0;0;1;0;2;2;0;0 -gfx90a [0x989f];3;7;7;11;30000;0;15;7;1;1;1;-1;-2;0;0;1;1;1;2;2;0;0 -gfx90a [0x989f];3;7;7;12;30000;0;12;7;1;1;1;1;-2;1;1;1;1;1;2;2;1;0 -gfx90a [0x989f];3;7;7;16;30000;0;15;7;1;1;1;-1;-2;1;1;0;1;1;2;1;0;0 -gfx90a [0x989f];3;7;7;23;30000;0;12;7;1;1;7;-2;0;0;0;1;1;1;2;1;0;0 -gfx90a [0x989f];3;7;8;7;30000;0;15;7;1;3;1;-2;1;0;0;0;1;0;0;2;0;0 -gfx90a [0x989f];3;7;8;8;30000;0;20;7;1;7;1;-1;-1;0;1;0;1;1;0;2;1;0 -gfx90a [0x989f];3;7;9;7;30000;0;20;7;1;6;1;-2;0;0;1;1;1;1;2;0;1;0 -gfx90a [0x989f];3;7;9;9;30000;0;15;7;1;1;1;1;-2;0;0;0;1;0;2;2;0;0 -gfx90a [0x989f];3;7;10;7;30000;0;20;7;1;4;1;1;0;0;1;0;1;1;2;0;0;0 -gfx90a [0x989f];3;7;10;10;30000;0;15;7;1;1;1;-2;0;1;0;0;1;0;2;2;1;0 -gfx90a [0x989f];3;7;11;7;30000;0;20;7;1;6;1;-2;0;0;1;0;1;1;2;2;0;0 -gfx90a [0x989f];3;7;11;11;30000;0;15;7;1;1;1;1;-2;0;0;0;1;0;0;0;0;0 -gfx90a [0x989f];3;7;12;7;30000;0;24;7;1;2;1;1;-1;1;0;0;1;1;0;0;0;0 -gfx90a [0x989f];3;7;12;12;30000;0;13;7;1;7;1;0;-2;0;0;0;1;0;0;0;0;0 -gfx90a [0x989f];3;7;16;7;30000;0;24;7;1;7;1;0;-2;1;1;0;1;1;2;2;1;0 -gfx90a [0x989f];3;7;16;16;30000;0;24;7;1;7;1;0;-2;0;0;0;1;0;2;2;0;0 -gfx90a [0x989f];3;7;23;7;30000;0;25;7;1;3;1;-2;1;1;1;1;1;1;0;0;0;0 -gfx90a [0x989f];3;7;23;23;30000;0;24;7;1;1;1;1;-2;1;0;1;1;1;2;0;1;0 -gfx90a [0x989f];3;8;3;3;30000;0;15;8;1;4;1;1;-2;0;0;0;1;0;2;0;0;0 -gfx90a [0x989f];3;8;3;8;30000;0;15;8;1;1;1;-2;-2;0;0;0;1;0;0;0;0;0 -gfx90a [0x989f];3;8;4;4;30000;0;9;8;1;1;1;-2;-1;0;0;0;1;0;2;0;0;0 -gfx90a [0x989f];3;8;4;8;30000;0;7;8;1;1;1;1;-2;0;0;0;1;0;0;2;0;0 -gfx90a [0x989f];3;8;5;5;30000;0;12;8;1;2;1;-1;4;0;0;0;1;0;2;0;0;0 -gfx90a [0x989f];3;8;5;8;30000;0;15;8;1;1;1;1;-2;0;0;0;1;0;0;0;0;0 -gfx90a [0x989f];3;8;6;6;30000;0;12;8;1;8;1;-2;-2;0;0;0;1;0;2;0;0;0 -gfx90a [0x989f];3;8;6;8;30000;0;15;8;1;1;1;-2;-1;0;0;0;1;0;0;2;0;0 -gfx90a [0x989f];3;8;7;7;30000;0;13;8;1;5;1;1;-2;0;0;0;1;0;0;2;0;0 -gfx90a [0x989f];3;8;7;8;30000;0;20;8;1;6;1;-1;-2;0;0;0;1;0;0;0;0;0 -gfx90a [0x989f];3;8;8;3;30000;0;15;8;1;1;1;1;-1;0;0;0;1;0;2;0;0;0 -gfx90a [0x989f];3;8;8;4;30000;0;15;8;1;7;1;0;-1;0;0;0;1;0;0;2;0;0 -gfx90a [0x989f];3;8;8;5;30000;0;15;8;1;8;1;0;-1;0;0;0;1;0;2;2;0;0 -gfx90a [0x989f];3;8;8;6;30000;0;15;8;1;4;1;0;0;0;0;0;1;0;2;0;0;0 -gfx90a [0x989f];3;8;8;7;30000;0;15;8;1;4;1;1;-1;1;1;1;1;1;0;0;1;0 -gfx90a [0x989f];3;8;8;8;30000;0;10;8;1;3;1;-1;0;0;1;1;1;1;0;2;1;0 -gfx90a [0x989f];3;8;8;16;30000;0;12;8;1;1;1;-1;-2;0;0;0;1;0;2;2;0;0 -gfx90a [0x989f];3;8;8;23;30000;0;12;8;1;1;1;1;-2;1;1;0;1;1;2;1;0;0 -gfx90a [0x989f];3;8;16;8;30000;0;24;8;1;2;1;-1;1;1;1;1;1;1;0;2;1;0 -gfx90a [0x989f];3;8;16;16;30000;0;20;8;1;1;1;1;-2;1;1;0;1;1;0;2;1;0 -gfx90a [0x989f];3;8;23;8;30000;0;26;8;1;8;1;1;-1;1;1;1;1;1;2;2;1;0 -gfx90a [0x989f];3;8;23;23;30000;0;24;8;1;8;1;0;-2;0;0;0;1;0;0;1;0;0 -gfx90a [0x989f];3;9;3;3;30000;0;9;9;1;9;1;-1;-2;0;0;0;1;0;0;0;0;0 -gfx90a [0x989f];3;9;3;9;30000;0;10;9;1;1;1;-2;0;0;1;1;1;1;2;2;0;0 -gfx90a [0x989f];3;9;4;4;30000;0;12;9;1;1;1;1;0;0;0;1;1;0;2;2;0;0 -gfx90a [0x989f];3;9;4;9;30000;0;15;9;1;6;1;1;-2;0;0;0;1;0;0;2;0;0 -gfx90a [0x989f];3;9;5;5;30000;0;13;9;1;9;1;-2;-2;0;0;0;1;0;2;2;0;0 -gfx90a [0x989f];3;9;5;9;30000;0;10;9;1;1;1;-2;0;1;1;0;1;1;2;0;0;0 -gfx90a [0x989f];3;9;6;6;30000;0;15;9;1;4;1;-1;1;0;1;1;1;1;0;0;1;0 -gfx90a [0x989f];3;9;6;9;30000;0;10;9;1;1;1;0;-2;1;1;1;1;1;0;2;0;0 -gfx90a [0x989f];3;9;7;7;30000;0;13;9;1;1;1;1;-2;0;1;0;1;1;2;0;0;0 -gfx90a [0x989f];3;9;7;9;30000;0;13;9;1;1;1;-2;0;1;1;1;1;1;2;0;1;0 -gfx90a [0x989f];3;9;9;3;30000;0;15;9;1;4;1;1;-1;0;1;0;1;1;0;0;0;0 -gfx90a [0x989f];3;9;9;4;30000;0;15;9;1;4;1;-1;-1;0;1;0;1;1;2;2;0;0 -gfx90a [0x989f];3;9;9;5;30000;0;15;9;1;2;1;0;1;0;1;0;1;1;2;0;0;0 -gfx90a [0x989f];3;9;9;6;30000;0;24;9;1;2;1;1;-2;0;0;1;1;1;0;0;1;0 -gfx90a [0x989f];3;9;9;7;30000;0;9;9;1;9;1;-1;0;1;1;1;1;1;0;0;1;0 -gfx90a [0x989f];3;9;9;9;30000;0;10;9;1;3;1;0;-1;0;1;1;1;1;0;2;1;0 -gfx90a [0x989f];3;9;9;16;30000;0;12;9;1;1;1;1;-2;0;0;1;1;1;2;2;0;0 -gfx90a [0x989f];3;9;9;23;30000;0;15;9;1;1;1;-1;-1;0;1;1;1;1;2;2;0;0 -gfx90a [0x989f];3;9;16;9;30000;0;24;9;1;8;1;0;-2;0;0;0;1;0;2;2;0;0 -gfx90a [0x989f];3;9;16;16;30000;0;12;9;1;1;1;1;-2;0;0;0;1;0;2;2;0;0 -gfx90a [0x989f];3;9;23;9;30000;0;26;9;1;8;1;0;-2;0;0;0;1;0;0;2;0;0 -gfx90a [0x989f];3;9;23;23;30000;0;3;8;1;5;1;0;2;0;0;0;1;0;1;2;0;0 -gfx90a [0x989f];3;10;3;3;30000;0;10;10;1;8;1;0;-2;0;1;0;1;1;2;0;0;0 -gfx90a [0x989f];3;10;3;10;30000;0;12;10;1;1;1;-1;-2;0;0;1;1;1;2;0;0;0 -gfx90a [0x989f];3;10;4;4;30000;0;13;10;1;3;1;-2;-1;1;1;0;1;1;0;2;0;0 -gfx90a [0x989f];3;10;4;10;30000;0;12;10;1;1;1;0;0;0;1;1;1;1;2;2;0;0 -gfx90a [0x989f];3;10;5;5;30000;0;15;10;1;3;1;-1;-2;0;1;1;1;1;0;0;1;0 -gfx90a [0x989f];3;10;5;10;30000;0;10;10;1;1;1;-2;0;1;0;1;1;1;2;2;0;0 -gfx90a [0x989f];3;10;6;6;30000;0;9;10;1;1;1;-1;-1;1;1;1;1;1;2;0;1;0 -gfx90a [0x989f];3;10;6;10;30000;0;12;10;1;1;1;0;0;1;1;0;1;1;0;0;0;0 -gfx90a [0x989f];3;10;7;7;30000;0;20;10;1;8;1;1;0;0;1;1;1;1;2;2;0;0 -gfx90a [0x989f];3;10;7;10;30000;0;9;10;1;1;1;1;-2;0;1;0;1;1;2;0;0;0 -gfx90a [0x989f];3;10;10;3;30000;0;15;10;1;10;0;1;-1;1;1;1;1;1;0;0;0;0 -gfx90a [0x989f];3;10;10;4;30000;0;20;10;1;5;1;0;1;0;0;0;1;0;2;0;0;0 -gfx90a [0x989f];3;10;10;5;30000;0;15;10;1;3;0;0;0;0;0;0;1;1;2;2;1;0 -gfx90a [0x989f];3;10;10;6;30000;0;25;10;1;7;1;0;-2;0;0;0;1;0;0;0;0;0 -gfx90a [0x989f];3;10;10;7;30000;0;15;10;1;1;1;0;0;0;0;0;1;0;2;2;0;0 -gfx90a [0x989f];3;10;10;10;30000;0;10;10;1;9;1;0;-2;0;1;1;1;1;0;1;0;0 -gfx90a [0x989f];3;10;10;16;30000;0;12;10;1;1;1;-2;0;0;1;1;1;0;2;0;0;0 -gfx90a [0x989f];3;10;10;23;30000;0;15;10;1;1;1;1;0;0;1;1;1;1;2;2;0;0 -gfx90a [0x989f];3;10;16;10;30000;0;13;10;1;1;1;-2;0;1;1;0;1;1;2;0;0;0 -gfx90a [0x989f];3;10;16;16;30000;0;15;10;1;1;1;-1;0;0;0;1;1;1;2;2;1;0 -gfx90a [0x989f];3;10;23;10;30000;0;24;10;1;4;1;-1;-1;0;1;1;1;1;0;0;1;0 -gfx90a [0x989f];3;10;23;23;30000;0;3;10;1;4;1;-2;2;0;0;0;1;0;1;0;0;0 -gfx90a [0x989f];3;11;3;3;30000;0;9;11;1;6;1;0;-2;0;0;0;1;0;0;0;0;0 -gfx90a [0x989f];3;11;3;11;30000;0;10;11;1;1;1;-1;-2;0;1;1;1;1;0;2;1;0 -gfx90a [0x989f];3;11;4;4;30000;0;13;11;1;3;1;0;-1;0;1;0;1;1;0;2;0;0 -gfx90a [0x989f];3;11;4;11;30000;0;12;11;1;1;1;-2;0;0;1;1;1;1;2;2;0;0 -gfx90a [0x989f];3;11;5;5;30000;0;10;11;1;1;1;0;-2;0;1;1;1;1;0;0;0;0 -gfx90a [0x989f];3;11;5;11;30000;0;10;11;1;1;1;0;0;0;0;0;1;1;0;2;0;0 -gfx90a [0x989f];3;11;6;6;30000;0;12;11;1;6;1;1;0;0;1;1;1;1;2;1;0;0 -gfx90a [0x989f];3;11;6;11;30000;0;12;11;1;1;1;-1;0;0;1;1;1;1;2;2;0;0 -gfx90a [0x989f];3;11;7;7;30000;0;13;11;1;1;1;-1;0;0;1;1;1;1;2;0;0;0 -gfx90a [0x989f];3;11;7;11;30000;0;5;8;1;7;1;-1;2;0;0;0;1;0;1;0;0;0 -gfx90a [0x989f];3;11;11;3;30000;0;22;11;1;2;1;-1;1;0;1;0;1;1;2;0;1;0 -gfx90a [0x989f];3;11;11;4;30000;0;20;11;1;2;1;-1;-2;0;1;1;1;1;0;0;0;0 -gfx90a [0x989f];3;11;11;5;30000;0;20;11;1;5;1;-2;1;0;1;1;1;1;2;0;1;0 -gfx90a [0x989f];3;11;11;6;30000;0;24;11;1;1;1;-2;0;0;0;0;1;1;2;2;0;0 -gfx90a [0x989f];3;11;11;7;30000;0;9;8;1;9;1;1;1;0;0;0;1;0;1;2;0;0 -gfx90a [0x989f];3;11;11;11;30000;0;12;11;1;10;1;-2;-2;0;1;0;1;1;2;0;0;0 -gfx90a [0x989f];3;11;11;16;30000;0;3;8;1;11;1;1;-1;1;0;0;1;0;1;2;0;0 -gfx90a [0x989f];3;11;11;23;30000;0;15;11;1;1;1;1;-1;0;1;1;1;1;2;2;0;0 -gfx90a [0x989f];3;11;16;11;30000;0;15;11;1;1;1;0;-2;0;1;0;1;1;2;2;0;0 -gfx90a [0x989f];3;11;16;16;30000;0;3;8;1;1;1;-1;-1;1;1;0;1;0;1;2;0;0 -gfx90a [0x989f];3;11;23;11;30000;0;40;11;1;1;1;-1;-2;1;0;0;1;1;2;0;1;0 -gfx90a [0x989f];3;11;23;23;30000;0;3;8;1;7;1;-1;2;0;1;0;1;0;1;2;1;0 -gfx90a [0x989f];3;12;3;3;30000;0;15;12;1;2;1;-1;-2;0;1;0;1;0;0;0;0;0 -gfx90a [0x989f];3;12;3;12;30000;0;10;12;1;1;1;1;-2;0;0;1;1;1;0;2;1;0 -gfx90a [0x989f];3;12;4;4;30000;0;11;12;1;12;1;0;0;0;1;0;1;1;0;0;0;0 -gfx90a [0x989f];3;12;4;12;30000;0;12;12;1;1;12;1;0;0;0;1;1;1;0;2;1;0 -gfx90a [0x989f];3;12;5;5;30000;0;10;12;1;7;1;0;0;0;1;1;1;1;2;0;0;0 -gfx90a [0x989f];3;12;5;12;30000;0;12;12;1;1;1;0;-2;0;1;1;1;1;2;0;0;0 -gfx90a [0x989f];3;12;6;6;30000;0;13;12;1;1;1;1;-2;0;1;0;1;1;0;0;1;0 -gfx90a [0x989f];3;12;6;12;30000;0;12;12;1;1;1;-1;-2;1;1;1;1;1;2;0;1;0 -gfx90a [0x989f];3;12;7;7;30000;0;15;12;1;1;1;0;0;1;1;1;1;1;2;0;1;0 -gfx90a [0x989f];3;12;7;12;30000;0;12;12;1;1;1;-1;0;0;1;1;1;1;0;2;1;0 -gfx90a [0x989f];3;12;12;3;30000;0;20;12;1;12;0;-2;-2;0;1;0;1;0;2;2;0;0 -gfx90a [0x989f];3;12;12;4;30000;0;20;12;1;9;0;0;-2;0;0;0;1;0;2;0;0;0 -gfx90a [0x989f];3;12;12;5;30000;0;9;12;1;2;1;-1;2;0;0;0;1;0;1;2;0;0 -gfx90a [0x989f];3;12;12;6;30000;0;15;12;1;12;1;-2;-2;0;0;0;1;0;0;0;0;0 -gfx90a [0x989f];3;12;12;7;30000;0;15;12;1;1;1;-2;-2;0;0;0;1;0;2;0;0;0 -gfx90a [0x989f];3;12;12;12;30000;0;12;12;1;8;1;0;0;0;1;0;1;1;0;1;0;0 -gfx90a [0x989f];3;12;12;16;30000;0;12;12;1;1;1;-1;-2;0;0;0;1;0;2;1;0;0 -gfx90a [0x989f];3;12;12;23;30000;0;4;8;1;2;1;1;2;0;0;0;1;0;1;2;0;0 -gfx90a [0x989f];3;12;16;12;30000;0;4;8;1;5;1;0;1;0;0;0;1;0;1;0;0;0 -gfx90a [0x989f];3;12;16;16;30000;0;15;12;1;1;1;1;0;0;0;1;1;1;2;2;0;0 -gfx90a [0x989f];3;12;23;12;30000;0;20;12;1;1;1;0;-2;0;0;1;1;1;2;2;1;0 -gfx90a [0x989f];3;12;23;23;30000;0;3;8;1;8;1;-2;-2;0;0;0;1;0;1;2;0;0 -gfx90a [0x989f];3;13;13;13;30000;0;12;13;1;11;1;0;-1;0;1;0;1;1;0;2;1;0 -gfx90a [0x989f];3;13;13;23;30000;0;12;13;1;1;1;-2;-2;0;1;0;1;1;2;0;1;0 -gfx90a [0x989f];3;13;13;32;30000;0;3;13;1;9;13;0;2;0;0;0;1;0;1;2;0;0 -gfx90a [0x989f];3;13;23;13;30000;0;30;8;1;10;1;1;2;0;0;0;1;0;1;0;0;0 -gfx90a [0x989f];3;13;23;23;30000;0;3;8;1;6;1;-1;2;0;0;0;1;0;1;2;0;0 -gfx90a [0x989f];3;14;14;14;30000;0;10;14;1;10;1;0;0;0;1;1;1;1;0;2;0;0 -gfx90a [0x989f];3;14;14;23;30000;0;15;14;1;1;1;-2;0;0;1;1;1;1;2;0;1;0 -gfx90a [0x989f];3;14;14;29;30000;0;4;8;1;5;14;0;1;0;0;0;1;0;1;0;0;0 -gfx90a [0x989f];3;14;14;32;30000;0;3;8;1;9;1;1;2;0;0;0;1;0;1;2;0;0 -gfx90a [0x989f];3;14;23;14;30000;0;26;8;1;2;1;-2;1;0;0;0;1;0;1;0;0;0 -gfx90a [0x989f];3;14;23;23;30000;0;40;8;1;3;1;1;2;0;0;0;1;0;1;0;0;0 -gfx90a [0x989f];3;14;29;14;30000;0;40;8;1;14;1;-1;1;0;0;0;1;0;1;2;0;0 -gfx90a [0x989f];3;14;29;29;30000;0;3;8;1;7;1;1;1;0;0;0;1;0;1;2;0;0 -gfx90a [0x989f];3;14;29;32;30000;0;3;8;1;4;1;1;1;0;1;1;1;0;1;2;1;0 -gfx90a [0x989f];3;14;32;14;30000;0;50;8;1;14;1;1;3;0;0;0;1;0;1;2;0;0 -gfx90a [0x989f];3;14;32;29;30000;0;3;8;1;2;1;1;4;0;0;0;1;0;1;2;0;0 -gfx90a [0x989f];3;14;32;32;30000;0;40;8;1;4;1;1;4;0;1;0;1;1;1;0;1;0 -gfx90a [0x989f];3;15;15;15;30000;0;5;8;1;3;1;0;0;0;1;1;1;0;1;0;1;0 -gfx90a [0x989f];3;15;15;23;30000;0;4;8;1;15;1;0;0;1;1;1;1;0;1;0;1;0 -gfx90a [0x989f];3;15;23;15;30000;0;4;8;1;11;1;0;-2;1;1;1;1;0;1;2;1;0 -gfx90a [0x989f];3;15;23;23;30000;0;4;8;1;6;1;-1;3;1;1;0;1;0;1;2;1;0 -gfx90a [0x989f];3;16;3;3;30000;0;15;16;1;10;0;-1;-2;0;1;0;1;1;0;0;0;0 -gfx90a [0x989f];3;16;3;16;30000;0;15;16;1;1;1;-2;0;0;1;0;1;1;2;0;1;0 -gfx90a [0x989f];3;16;4;4;30000;0;12;16;1;6;1;0;-1;0;1;0;1;1;0;0;1;0 -gfx90a [0x989f];3;16;4;16;30000;0;4;8;1;7;1;0;-1;1;0;0;1;0;1;0;0;0 -gfx90a [0x989f];3;16;5;5;30000;0;21;8;1;7;1;-2;-2;0;0;1;1;0;1;2;0;0 -gfx90a [0x989f];3;16;5;16;30000;0;8;8;1;6;1;-1;2;0;1;0;1;0;1;0;0;0 -gfx90a [0x989f];3;16;6;6;30000;0;9;16;1;1;1;1;-2;1;0;1;1;1;2;0;1;0 -gfx90a [0x989f];3;16;6;16;30000;0;12;16;1;1;1;1;0;0;1;1;1;1;2;0;1;0 -gfx90a [0x989f];3;16;7;7;30000;0;10;16;1;1;0;-2;0;0;1;1;1;1;2;2;1;0 -gfx90a [0x989f];3;16;7;16;30000;0;24;16;1;13;1;0;0;0;1;0;1;1;2;2;0;0 -gfx90a [0x989f];3;16;8;8;30000;0;24;16;1;3;0;-2;-1;0;0;0;1;1;2;2;1;0 -gfx90a [0x989f];3;16;8;16;30000;0;7;8;1;4;1;0;0;1;0;1;1;0;1;2;0;0 -gfx90a [0x989f];3;16;9;9;30000;0;6;8;1;3;1;-2;1;1;1;0;1;1;1;0;0;0 -gfx90a [0x989f];3;16;9;16;30000;0;4;8;1;5;1;-2;2;1;1;1;1;0;1;2;0;0 -gfx90a [0x989f];3;16;10;10;30000;0;30;16;1;9;0;-1;2;0;1;0;1;0;1;0;0;0 -gfx90a [0x989f];3;16;10;16;30000;0;5;8;1;5;1;-2;0;0;0;0;1;0;1;2;0;0 -gfx90a [0x989f];3;16;11;11;30000;0;25;8;1;4;1;0;-1;0;0;0;1;0;1;2;0;0 -gfx90a [0x989f];3;16;11;16;30000;0;30;8;1;14;1;-1;1;0;0;0;1;0;1;0;0;0 -gfx90a [0x989f];3;16;12;12;30000;0;5;8;1;1;1;1;2;0;0;0;1;0;1;2;0;0 -gfx90a [0x989f];3;16;12;16;30000;0;5;16;1;14;1;0;2;0;0;0;1;0;1;0;0;0 -gfx90a [0x989f];3;16;16;3;30000;0;24;16;1;11;1;-1;-2;0;0;0;1;0;0;2;0;0 -gfx90a [0x989f];3;16;16;4;30000;0;24;16;1;1;1;0;2;0;0;0;1;0;1;2;0;0 -gfx90a [0x989f];3;16;16;5;30000;0;20;16;1;1;1;0;-2;1;0;0;1;1;2;2;1;0 -gfx90a [0x989f];3;16;16;6;30000;0;25;8;1;15;1;-1;2;1;0;0;1;1;1;0;0;0 -gfx90a [0x989f];3;16;16;7;30000;0;25;16;1;9;1;-2;2;0;0;0;1;0;1;2;0;0 -gfx90a [0x989f];3;16;16;8;30000;0;25;16;1;10;1;0;2;0;0;0;1;0;1;2;0;0 -gfx90a [0x989f];3;16;16;9;30000;0;25;8;1;6;1;-2;2;1;1;1;1;0;1;2;0;0 -gfx90a [0x989f];3;16;16;10;30000;0;25;8;1;4;1;0;3;1;1;0;1;0;1;2;0;0 -gfx90a [0x989f];3;16;16;11;30000;0;25;8;1;8;1;1;2;1;1;0;1;0;1;2;0;0 -gfx90a [0x989f];3;16;16;12;30000;0;25;8;1;7;1;-2;-2;1;0;1;1;0;1;2;0;0 -gfx90a [0x989f];3;16;16;16;30000;0;12;16;1;2;1;1;-1;0;1;1;1;1;2;0;1;0 -gfx90a [0x989f];3;16;16;23;30000;0;4;8;1;4;1;0;-1;0;0;0;1;0;1;2;0;0 -gfx90a [0x989f];3;16;23;16;30000;0;40;8;1;4;1;-2;-1;1;1;1;1;0;1;2;0;0 -gfx90a [0x989f];3;16;23;23;30000;0;50;8;1;15;1;-1;-1;0;0;0;1;0;1;2;0;0 -gfx90a [0x989f];3;17;17;17;30000;0;12;17;1;12;1;-2;-2;0;1;0;1;0;0;2;0;0 -gfx90a [0x989f];3;17;17;23;30000;0;3;8;1;11;1;-1;1;0;0;0;1;0;1;2;0;0 -gfx90a [0x989f];3;17;17;32;30000;0;3;8;1;17;17;-1;-2;0;0;0;1;0;1;2;0;0 -gfx90a [0x989f];3;17;17;35;30000;0;3;8;1;17;17;-1;0;0;0;0;1;0;1;2;0;0 -gfx90a [0x989f];3;17;23;17;30000;0;15;17;1;1;1;-2;-2;0;0;0;1;0;2;2;0;0 -gfx90a [0x989f];3;17;23;23;30000;0;24;17;1;1;1;-1;0;1;0;0;1;1;2;1;0;0 -gfx90a [0x989f];3;17;32;17;30000;0;20;17;1;1;1;0;-2;1;0;0;1;1;2;0;0;0 -gfx90a [0x989f];3;17;32;35;30000;0;3;8;1;11;1;1;1;0;1;0;1;0;1;0;1;0 -gfx90a [0x989f];3;17;35;17;30000;0;25;17;1;5;1;-2;-1;1;1;0;1;0;1;2;0;0 -gfx90a [0x989f];3;17;35;32;30000;0;3;17;1;16;1;0;0;1;1;0;1;0;1;2;0;0 -gfx90a [0x989f];3;17;35;35;30000;0;20;17;1;1;1;1;0;1;1;1;1;0;0;0;0;0 -gfx90a [0x989f];3;18;18;18;30000;0;4;8;1;6;1;-2;-2;0;0;0;1;0;1;0;0;0 -gfx90a [0x989f];3;18;18;23;30000;0;3;8;1;14;1;0;-2;0;0;0;1;0;1;2;0;0 -gfx90a [0x989f];3;18;23;18;30000;0;4;18;1;4;1;1;3;0;0;0;1;0;1;0;0;0 -gfx90a [0x989f];3;18;23;23;30000;0;4;8;1;16;1;0;3;0;0;0;1;0;1;2;0;0 -gfx90a [0x989f];3;19;19;19;30000;0;40;8;1;10;1;1;3;0;0;0;1;0;1;2;0;0 -gfx90a [0x989f];3;19;19;23;30000;0;40;8;1;15;1;-1;-2;0;0;0;1;0;1;0;0;0 -gfx90a [0x989f];3;23;23;23;30000;0;20;23;1;10;23;-2;-2;0;1;1;1;1;2;2;0;0 -gfx90a [0x989f];3;28;28;28;30000;0;3;28;1;28;28;-2;2;0;0;0;1;0;1;0;0;0 -gfx90a [0x989f];3;32;32;32;30000;0;25;32;1;20;1;-2;0;0;1;0;1;0;2;0;0;0 -gfx90a [0x989f];3;35;17;17;30000;0;15;35;1;29;1;1;0;0;1;0;1;0;2;1;0;0 -gfx90a [0x989f];3;35;17;32;30000;0;20;35;1;1;1;0;-2;1;1;0;1;1;2;0;0;0 -gfx90a [0x989f];3;35;17;35;30000;0;7;35;1;31;1;-2;4;1;0;0;1;1;1;2;1;0 -gfx90a [0x989f];3;35;32;17;30000;0;39;35;1;35;1;1;4;0;1;1;1;1;1;0;0;0 -gfx90a [0x989f];3;35;32;35;30000;0;3;35;1;31;1;-2;0;1;1;0;1;1;1;2;0;0 -gfx90a [0x989f];3;35;35;17;30000;0;33;35;1;20;1;1;4;1;1;1;1;0;1;0;0;0 -gfx90a [0x989f];3;35;35;32;30000;0;15;35;1;35;35;-2;0;0;1;0;1;1;2;2;0;0 -gfx90a [0x989f];3;35;35;35;30000;0;2;35;1;30;0;1;-1;0;1;0;1;0;1;2;0;0 diff --git a/src/acc/opencl/smm/params/tune_multiply_P100.csv b/src/acc/opencl/smm/params/tune_multiply_P100.csv deleted file mode 100644 index ad038b17ef7..00000000000 --- a/src/acc/opencl/smm/params/tune_multiply_P100.csv +++ /dev/null @@ -1,251 +0,0 @@ -DEVICE;TYPEID;M;N;K;S;GFLOPS;BS;BM;BN;BK;WS;WG;LU;NZ;AL;TB;TC;AP;AA;AB;AC -Tesla P100-PCIE-16GB [0x2f6c];3;2;2;2;30000;23.4;17;2;1;2;0;-2;0;0;0;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;3;3;1;30000;33.4;20;3;1;2;0;-2;-2;0;1;0;1;1;2;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;3;3;3;30000;61.7;20;3;1;2;0;-2;-2;0;0;1;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;4;4;4;30000;144.3;17;4;1;2;0;0;0;0;1;1;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;5;5;5;30000;184.7;30;5;1;3;0;0;0;0;0;0;1;1;1;0;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;5;5;7;30000;190.1;31;5;1;3;0;-1;-2;0;1;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;5;5;13;30000;218.9;60;5;1;4;0;-2;-1;0;1;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;5;5;16;30000;217.4;60;5;1;4;0;-2;-1;0;0;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;5;5;24;30000;222.9;30;5;1;5;0;0;-2;1;1;1;1;1;1;2;1;0 -Tesla P100-PCIE-16GB [0x2f6c];3;5;5;26;30000;227.5;40;5;1;4;0;-1;-2;0;0;1;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;5;7;5;30000;246.9;20;5;1;2;0;0;-2;0;1;1;1;1;1;0;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;5;7;7;30000;270.9;25;5;1;3;0;-2;-2;0;0;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;5;7;13;30000;294.2;30;5;1;5;0;0;-1;0;1;1;1;1;1;0;1;0 -Tesla P100-PCIE-16GB [0x2f6c];3;5;13;5;30000;396.8;20;5;1;4;0;0;-2;1;0;0;1;1;1;0;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;5;13;7;30000;449.7;26;5;1;4;0;1;-2;1;0;1;1;1;1;0;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;5;13;13;30000;498.4;40;5;1;2;0;0;-2;1;0;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;5;13;16;30000;461.2;20;5;1;3;0;0;-2;1;1;1;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;5;13;24;30000;494.4;60;5;1;4;0;-1;-1;1;0;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;5;13;26;30000;486.0;30;5;1;4;0;-1;-1;1;1;0;1;1;1;2;1;0 -Tesla P100-PCIE-16GB [0x2f6c];3;5;16;5;30000;454.9;24;5;1;3;0;-2;0;1;1;1;1;1;1;0;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;5;16;13;30000;578.2;25;5;1;2;0;1;0;1;1;1;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;5;16;16;30000;597.7;30;5;1;2;0;-2;-2;0;1;1;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;5;16;24;30000;597.0;30;5;1;3;0;-2;-2;1;1;0;1;1;1;0;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;5;16;26;30000;594.9;30;5;1;4;0;-2;-1;1;0;0;1;1;1;0;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;5;24;5;30000;553.6;24;5;1;3;0;0;0;1;0;1;1;1;1;0;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;5;24;13;30000;677.3;40;5;1;4;0;-1;-2;0;0;0;1;1;1;2;1;0 -Tesla P100-PCIE-16GB [0x2f6c];3;5;24;16;30000;664.1;50;5;1;3;0;1;-1;0;1;1;1;1;1;0;1;0 -Tesla P100-PCIE-16GB [0x2f6c];3;5;24;24;30000;734.9;50;5;1;5;0;-1;-1;0;1;1;1;1;1;0;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;5;24;26;30000;724.8;50;5;1;2;0;-1;0;0;0;0;1;0;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;5;26;5;30000;556.3;24;5;1;2;0;-2;0;0;0;1;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;5;26;13;30000;753.2;60;5;1;2;0;1;1;1;1;0;1;1;1;0;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;5;26;16;30000;744.1;30;5;1;4;0;1;-2;1;1;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;5;26;24;30000;658.7;60;5;1;4;0;-1;0;0;0;1;1;1;1;2;1;0 -Tesla P100-PCIE-16GB [0x2f6c];3;5;26;26;30000;521.7;7;5;1;3;0;-1;-2;1;1;1;1;1;1;1;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;6;6;6;30000;272.0;25;6;1;5;0;1;0;0;1;1;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;7;5;5;30000;158.7;30;7;1;5;0;0;-1;0;0;1;1;1;1;0;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;7;5;7;30000;165.6;30;7;1;7;0;-2;-1;0;0;0;1;1;1;0;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;7;5;13;30000;190.0;1;7;1;5;0;-1;-1;1;0;0;1;0;1;2;1;0 -Tesla P100-PCIE-16GB [0x2f6c];3;7;7;5;30000;331.1;25;7;1;2;0;-2;0;0;1;1;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;7;7;7;30000;354.4;26;7;1;4;0;-1;-2;0;0;1;1;1;1;0;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;7;7;13;30000;394.8;30;7;1;5;0;0;-2;0;0;1;1;1;1;0;1;0 -Tesla P100-PCIE-16GB [0x2f6c];3;7;13;5;30000;494.5;25;7;1;6;0;-1;-1;0;0;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;7;13;7;30000;571.0;26;7;1;3;0;-2;-1;0;0;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;7;13;13;30000;654.0;30;7;1;2;0;1;0;0;0;0;1;1;1;0;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;8;8;8;30000;471.1;30;8;1;7;0;0;-1;1;0;0;1;1;1;0;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;9;9;9;30000;545.1;30;9;1;6;0;0;-2;0;0;0;1;1;1;0;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;9;9;16;30000;577.2;30;9;1;8;0;0;-1;0;0;1;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;9;9;22;30000;566.3;40;9;1;4;0;-1;-1;0;1;1;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;9;9;32;30000;546.8;50;9;1;5;0;0;0;0;0;1;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;9;16;9;30000;791.8;30;9;1;7;0;0;-2;1;0;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;9;16;16;30000;856.2;30;9;1;8;0;-1;0;1;1;0;1;1;1;0;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;9;16;22;30000;879.6;50;9;1;4;0;0;0;0;1;0;1;1;1;0;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;9;22;9;30000;945.7;40;9;1;8;0;-2;0;0;0;1;1;1;1;0;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;9;22;16;30000;1062.4;40;9;1;3;0;-2;-1;1;1;1;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;9;22;22;30000;1065.8;60;9;1;5;0;0;0;0;1;1;1;1;1;0;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;9;22;32;30000;1072.5;60;9;1;2;0;0;-2;0;1;1;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;9;32;9;30000;1113.6;50;9;1;6;0;1;0;1;0;1;1;1;1;0;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;9;32;22;30000;1351.2;60;9;1;3;0;-2;0;1;0;1;1;1;1;0;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;9;32;32;30000;1398.1;60;9;1;8;0;-2;0;1;1;1;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;10;10;10;30000;637.6;30;10;1;2;0;-1;-1;0;0;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;13;5;5;30000;245.9;20;13;1;2;0;1;-1;0;0;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;13;5;7;30000;262.0;24;13;1;12;0;-1;0;0;0;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;13;5;8;30000;268.9;25;13;1;11;0;-1;-1;0;1;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;13;5;13;30000;278.8;30;13;1;4;0;-1;-1;0;0;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;13;5;16;30000;457.6;30;13;1;9;0;-2;-1;0;1;0;1;1;1;2;1;0 -Tesla P100-PCIE-16GB [0x2f6c];3;13;5;24;30000;464.2;40;13;1;13;0;-1;0;0;0;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;13;5;26;30000;437.1;53;13;1;6;0;1;-2;0;0;1;1;1;1;2;1;0 -Tesla P100-PCIE-16GB [0x2f6c];3;13;7;5;30000;347.6;25;13;1;12;0;-1;-2;0;1;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;13;7;7;30000;364.8;24;13;1;5;0;-2;-2;0;0;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;13;7;13;30000;433.8;30;13;1;13;0;1;0;0;0;1;1;1;1;0;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;13;8;5;30000;388.2;25;13;1;11;0;-2;-1;0;1;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;13;13;5;30000;716.0;26;13;1;12;0;-1;-2;0;0;0;1;1;1;0;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;13;13;7;30000;808.8;40;13;1;6;0;0;-2;0;1;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;13;13;13;30000;838.5;50;13;1;5;0;-2;-2;0;0;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;13;13;16;30000;875.5;50;13;1;8;0;1;-1;0;0;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;13;13;24;30000;749.0;17;13;1;10;0;-1;0;0;1;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;13;13;26;30000;746.5;5;13;1;6;0;-2;-1;1;0;1;1;1;1;0;1;0 -Tesla P100-PCIE-16GB [0x2f6c];3;13;16;5;30000;770.1;25;13;1;12;0;1;-2;0;0;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;13;16;13;30000;982.7;50;13;1;13;0;-1;-1;1;0;0;1;1;1;0;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;13;16;16;30000;973.6;60;13;1;7;0;0;-1;0;1;1;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;13;16;24;30000;1050.2;60;13;1;8;0;0;0;0;1;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;13;16;26;30000;975.0;53;13;1;2;0;-1;0;1;0;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;13;24;5;30000;825.2;50;13;1;6;0;-1;-1;0;1;0;1;1;1;0;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;13;24;13;30000;1175.7;40;13;1;6;0;-1;-2;1;1;0;1;0;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;13;24;16;30000;1263.4;40;13;1;4;0;-2;1;1;0;0;1;0;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;13;24;24;30000;1356.1;60;13;1;7;0;1;-1;1;0;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;13;24;26;30000;1209.2;53;13;1;6;0;-1;-1;0;1;0;1;0;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;13;26;5;30000;874.1;30;13;1;11;0;-2;-1;0;0;1;1;1;1;0;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;13;26;13;30000;1295.5;60;13;1;13;0;-2;-2;1;1;1;1;1;1;1;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;13;26;16;30000;1376.1;60;13;1;4;0;1;-2;1;1;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;13;26;24;30000;1084.3;54;13;1;8;0;-1;-1;0;0;1;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;13;26;26;30000;1427.8;60;13;1;11;0;1;0;0;1;0;1;0;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;14;14;14;30000;908.2;50;14;1;3;0;1;-1;0;0;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;14;14;16;30000;947.5;30;14;1;14;0;0;0;0;1;1;1;0;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;14;14;29;30000;834.1;5;14;1;6;0;0;0;0;0;0;1;1;1;1;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;14;16;14;30000;987.5;40;14;1;13;0;-1;-2;1;0;1;1;0;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;14;16;16;30000;1013.9;60;14;1;7;0;-2;-1;0;0;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;14;16;29;30000;893.9;4;14;1;4;0;0;0;1;1;1;1;1;1;0;1;0 -Tesla P100-PCIE-16GB [0x2f6c];3;14;29;14;30000;1441.8;60;14;1;7;0;-2;-2;1;0;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;14;29;16;30000;1521.6;60;14;1;13;0;1;-1;0;0;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;14;29;29;30000;1489.4;50;14;1;9;0;0;-1;1;1;1;1;0;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;15;15;15;30000;973.0;30;15;1;12;0;-2;-2;0;0;0;1;1;1;0;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;16;5;5;0;194.0;23;16;1;0;0;0;0;0;0;0;1;0;0;0;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;16;5;13;30000;581.2;50;16;1;16;0;-1;1;0;0;0;1;1;1;0;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;16;5;16;30000;592.4;40;16;1;12;0;-1;0;0;1;1;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;16;5;24;30000;439.1;6;16;1;14;0;1;1;0;0;1;1;1;1;1;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;16;5;26;30000;581.3;60;16;1;15;0;0;0;0;0;1;1;1;1;2;1;0 -Tesla P100-PCIE-16GB [0x2f6c];3;16;8;5;30000;462.6;25;16;1;8;0;-2;-2;0;0;1;1;1;1;0;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;16;8;8;30000;511.4;30;16;1;15;0;0;-2;0;0;1;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;16;9;9;30000;562.2;30;16;1;16;0;1;0;0;0;1;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;16;9;16;30000;634.9;40;16;1;7;0;0;-1;0;1;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;16;9;22;30000;632.4;50;16;1;10;0;-2;-2;0;0;1;1;1;1;0;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;16;13;5;30000;786.7;24;16;1;15;0;-2;-1;0;0;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;16;13;13;30000;1056.9;25;16;1;2;0;1;1;1;1;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;16;13;16;30000;1147.4;30;16;1;4;0;0;-2;0;0;0;1;1;1;0;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;16;13;24;30000;852.4;5;16;1;10;0;-1;-2;1;0;0;1;1;1;1;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;16;13;26;30000;1097.1;40;16;1;15;0;1;-1;1;0;1;1;0;1;0;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;16;14;14;30000;1136.9;25;16;1;12;0;1;-2;0;1;1;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;16;14;16;30000;1169.5;30;16;1;14;0;-1;-1;0;0;0;1;0;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;16;14;29;30000;901.8;7;16;1;10;0;1;0;0;0;0;1;0;1;1;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;16;16;5;30000;860.6;25;16;1;16;0;-1;-2;0;1;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;16;16;9;30000;1044.8;50;16;1;7;0;0;0;0;0;1;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;16;16;13;30000;1059.9;50;16;1;15;0;-2;0;0;0;0;1;0;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;16;16;14;30000;1083.5;40;16;1;15;0;0;-1;0;0;0;1;0;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;16;16;16;30000;1099.0;40;16;1;14;0;-1;0;0;0;1;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;16;16;22;30000;1128.1;60;16;1;10;0;1;-2;0;0;0;1;1;1;0;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;16;16;24;30000;1110.8;40;16;1;15;0;0;-2;0;1;1;1;0;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;16;16;26;30000;1104.1;50;16;1;11;0;0;-2;1;0;0;1;0;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;16;16;29;30000;977.5;5;16;1;6;0;1;-2;0;1;1;1;1;1;1;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;16;16;55;30000;1030.9;1;16;1;7;0;1;1;0;0;1;1;0;1;0;1;0 -Tesla P100-PCIE-16GB [0x2f6c];3;16;22;9;30000;1267.6;30;16;1;2;0;0;-1;0;1;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;16;22;16;30000;1382.6;50;16;1;8;0;1;1;1;1;0;1;1;1;0;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;16;22;22;30000;1411.9;60;16;1;12;0;1;-2;1;0;1;1;1;1;0;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;16;24;5;30000;877.9;25;16;1;11;0;0;-2;1;0;0;1;0;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;16;24;13;30000;1361.4;40;16;1;13;0;1;-2;1;0;0;1;1;1;0;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;16;24;16;30000;1463.5;60;16;1;4;0;-2;-2;0;0;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;16;24;24;30000;1164.1;36;16;1;10;0;-1;0;0;0;1;1;0;1;0;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;16;24;26;30000;1158.0;7;16;1;15;0;1;0;0;0;1;1;1;1;1;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;16;26;5;30000;969.1;30;16;1;10;0;-1;-1;0;0;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;16;26;13;30000;1469.9;50;16;1;5;0;1;0;1;1;1;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;16;26;16;30000;1548.9;60;16;1;6;0;-1;0;1;0;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;16;26;24;30000;1554.5;60;16;1;11;0;0;-1;0;0;0;1;0;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;16;26;26;30000;1486.2;50;16;1;11;0;0;-1;0;1;0;1;0;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;16;29;14;30000;1578.2;50;16;1;4;0;-1;1;1;0;1;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;16;29;16;30000;1569.0;50;16;1;9;0;0;0;0;0;0;1;0;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;16;29;29;30000;1555.2;50;16;1;10;0;-1;-2;0;0;1;1;0;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;16;29;55;30000;1359.1;17;16;1;15;0;1;0;0;1;1;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;16;55;16;30000;1411.0;45;16;1;3;0;-2;1;1;0;1;1;1;1;1;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;16;55;29;30000;1505.1;23;16;1;13;0;0;-1;0;0;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;16;55;55;30000;1634.4;36;16;1;13;0;-1;0;0;1;0;1;0;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;20;20;20;30000;1396.9;50;20;1;8;0;-2;-2;0;0;1;1;0;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;22;9;9;30000;620.0;30;22;1;14;0;1;0;0;0;0;1;1;1;1;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;22;9;16;30000;635.4;40;22;1;21;0;-2;-2;0;0;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;22;9;22;30000;642.7;60;22;1;18;0;-2;-1;0;0;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;22;9;32;30000;603.6;27;22;1;17;0;-1;0;0;0;1;1;1;1;0;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;22;16;9;30000;955.7;50;22;1;12;0;-2;-2;1;0;1;1;1;1;0;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;22;16;16;30000;1124.4;50;22;1;11;0;-1;-2;0;0;1;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;22;16;22;30000;1161.8;60;22;1;21;0;0;0;0;0;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;22;22;9;30000;1371.4;60;22;1;8;0;0;-1;0;0;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;22;22;16;30000;1475.2;50;22;1;8;0;-1;-2;0;1;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;22;22;22;30000;1550.1;60;22;1;19;0;0;-1;0;0;1;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;22;22;32;30000;1421.8;40;22;1;1;0;-2;0;0;0;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;22;32;9;30000;1594.6;50;22;1;3;0;0;1;0;1;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;22;32;22;30000;2044.8;60;22;1;10;0;-2;0;0;1;0;1;0;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;22;32;32;30000;2052.0;60;22;1;15;0;0;0;0;1;0;1;0;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;23;23;23;30000;1657.8;50;23;1;17;0;0;0;0;0;1;1;0;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;24;5;5;30000;557.5;24;24;1;1;0;-1;-1;0;1;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;24;5;13;30000;657.2;40;24;1;22;0;0;0;1;1;0;1;1;1;2;1;0 -Tesla P100-PCIE-16GB [0x2f6c];3;24;5;16;30000;652.6;50;24;1;13;0;0;-1;1;0;1;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;24;5;24;30000;600.1;53;24;1;1;0;-2;1;0;1;1;1;0;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;24;5;26;30000;621.4;60;24;1;20;0;0;-2;1;0;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;24;13;5;30000;857.0;30;24;1;20;0;1;-1;1;0;1;1;1;1;0;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;24;13;13;30000;1145.1;25;24;1;22;0;1;1;1;0;0;1;0;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;24;13;16;30000;991.2;45;24;1;19;0;-1;0;0;0;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;24;13;24;30000;1111.6;50;24;1;6;0;-1;-1;0;0;1;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;24;13;26;30000;1022.9;25;24;1;22;0;-2;-1;0;1;1;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;24;16;5;30000;980.0;40;24;1;10;0;-1;0;0;0;1;1;1;1;0;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;24;16;13;30000;1524.4;50;24;1;21;0;-2;-1;0;0;1;1;1;1;0;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;24;16;16;30000;1541.4;60;24;1;12;0;0;-1;1;0;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;24;16;24;30000;1506.5;50;24;1;24;0;-1;-1;0;1;1;1;0;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;24;16;26;30000;1178.7;26;24;1;24;0;0;0;1;0;1;1;1;1;1;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;24;24;5;30000;1051.1;50;24;1;23;0;1;-2;1;0;1;1;1;1;0;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;24;24;13;30000;1584.1;50;24;1;7;0;-1;-1;1;1;1;1;1;1;0;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;24;24;16;30000;1630.0;60;24;1;5;0;0;-2;0;0;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;24;24;24;30000;1606.4;50;24;1;1;0;1;0;1;0;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;24;24;26;30000;1483.6;46;24;1;4;0;-1;0;0;1;1;1;0;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;24;26;5;30000;1069.4;40;24;1;20;0;0;-1;0;1;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;24;26;13;30000;1516.6;40;24;1;23;0;-1;-1;0;0;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;24;26;16;30000;1617.3;40;24;1;21;0;1;0;0;0;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;24;26;24;30000;1806.5;60;24;1;13;0;-2;0;0;0;0;1;0;1;0;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;24;26;26;30000;1777.9;60;24;1;17;0;1;0;1;0;1;1;0;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;25;25;25;30000;1779.6;60;25;1;12;0;-2;-1;0;0;1;1;0;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;26;5;5;30000;534.8;20;26;1;1;0;-1;0;1;0;1;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;26;5;13;30000;691.2;40;26;1;13;0;-1;-2;1;1;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;26;5;16;30000;693.3;40;26;1;21;0;0;-1;0;1;0;1;0;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;26;5;24;30000;520.0;25;26;1;23;0;1;-2;0;0;0;1;0;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;26;5;26;30000;524.8;3;26;1;25;0;1;1;1;1;0;1;1;1;2;1;0 -Tesla P100-PCIE-16GB [0x2f6c];3;26;13;5;30000;939.0;40;26;1;9;0;-1;-1;0;1;0;1;1;1;0;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;26;13;13;30000;1240.9;40;26;1;7;0;-2;0;0;0;0;1;1;1;0;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;26;13;16;30000;1178.2;50;26;1;22;0;0;-2;1;0;0;1;1;1;0;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;26;13;24;30000;1030.6;24;26;1;26;0;1;-1;0;1;0;1;0;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;26;13;26;30000;1253.7;60;26;1;1;0;1;0;1;0;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;26;16;5;30000;976.2;40;26;1;11;0;0;-2;1;0;0;1;1;1;0;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;26;16;13;30000;1571.2;50;26;1;26;0;1;1;0;0;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;26;16;16;30000;1174.4;47;26;1;4;0;-1;-1;1;0;1;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;26;16;24;30000;1579.9;60;26;1;23;0;1;-1;0;1;1;1;0;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;26;16;26;30000;1195.7;25;26;1;18;0;-2;-2;0;1;1;1;0;1;0;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;26;24;5;30000;1085.3;50;26;1;26;0;0;0;0;0;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;26;24;13;30000;1443.2;50;26;1;1;0;1;-1;1;1;1;1;1;1;0;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;26;24;16;30000;1652.9;60;26;1;9;0;0;0;0;0;1;1;1;1;0;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;26;24;24;30000;1443.9;30;26;1;15;0;0;-1;0;0;0;1;0;1;1;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;26;24;26;30000;1482.0;36;26;1;23;0;1;0;0;1;0;1;1;1;1;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;26;26;5;30000;1076.0;50;26;1;23;0;0;-1;0;0;0;1;0;1;1;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;26;26;13;30000;1654.9;60;26;1;23;0;0;-2;0;0;0;1;0;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;26;26;16;30000;1613.0;53;26;1;26;0;-1;0;0;1;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;26;26;24;30000;1521.5;25;26;1;17;0;1;-1;0;0;1;1;0;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;26;26;26;30000;1825.8;60;26;1;22;0;1;0;0;0;1;1;0;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;28;28;28;30000;2017.4;60;28;1;25;0;0;0;0;0;1;1;0;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;29;14;14;30000;1063.5;50;29;1;28;0;0;-1;0;0;0;1;0;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;29;14;16;30000;1124.0;60;29;1;27;0;0;0;1;1;0;1;0;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;29;14;29;30000;1086.7;7;29;1;26;0;-2;0;1;0;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;29;16;14;30000;1190.2;55;29;1;1;0;1;-1;1;1;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;29;16;16;30000;1402.8;50;29;1;5;0;1;0;0;0;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;29;16;29;30000;1226.1;30;29;1;14;0;-2;0;1;0;0;1;0;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;29;16;55;30000;1096.1;9;29;1;22;0;0;0;1;0;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;29;29;14;30000;1676.4;40;29;1;24;0;-1;0;1;1;1;1;0;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;29;29;16;30000;1869.9;60;29;1;10;0;1;-1;0;0;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;29;29;29;30000;1741.8;40;29;1;25;0;-2;0;0;0;0;1;0;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;29;29;55;30000;1646.8;37;29;1;28;0;1;-2;1;1;1;1;0;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;29;55;16;30000;1872.0;40;29;1;27;0;0;0;0;0;0;1;0;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;29;55;29;30000;2156.0;31;29;1;17;0;0;0;1;0;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;29;55;55;30000;2066.8;5;29;1;25;0;0;0;0;0;0;1;0;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;30;30;30;30000;1919.2;40;30;1;1;0;-2;0;0;0;0;1;1;1;0;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;32;32;9;30000;1831.3;60;32;1;6;0;-1;1;1;0;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;32;32;22;30000;2073.6;40;32;1;1;0;-1;-1;0;1;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;32;32;32;30000;2187.8;50;32;1;1;0;1;0;0;0;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;35;35;35;30000;1744.5;18;35;1;33;0;2;0;0;0;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;36;36;36;30000;1823.8;36;36;1;24;0;-1;-2;0;0;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;40;40;40;0;1912.2;34;40;1;0;0;0;0;0;0;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;55;16;16;30000;1311.0;25;55;1;32;0;0;0;1;1;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;55;16;29;30000;1499.1;22;55;1;19;0;-1;0;1;0;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;55;16;55;30000;1080.8;8;55;1;19;0;-1;0;1;0;1;1;0;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;55;29;16;30000;1699.5;34;55;1;19;0;-1;-1;0;1;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;55;29;29;30000;1710.1;9;55;1;52;0;0;0;0;0;0;1;1;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;55;29;55;30000;1030.0;8;55;1;33;0;0;0;0;0;0;1;0;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;55;55;16;30000;2125.2;46;55;1;51;0;0;-2;0;0;0;1;0;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;55;55;29;30000;2243.0;8;55;1;29;0;0;0;0;1;0;1;0;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;55;55;55;30000;1768.7;8;55;1;42;0;0;0;0;0;0;1;0;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;64;64;64;30000;1239.7;55;64;1;1;0;0;0;0;0;0;0;0;1;2;0;0 -Tesla P100-PCIE-16GB [0x2f6c];3;78;78;78;30000;524.9;1;78;1;43;0;-1;1;0;1;0;1;1;0;2;1;0 diff --git a/src/acc/opencl/smm/params/tune_multiply_PVC.csv b/src/acc/opencl/smm/params/tune_multiply_PVC.csv deleted file mode 100644 index fddcb2feeed..00000000000 --- a/src/acc/opencl/smm/params/tune_multiply_PVC.csv +++ /dev/null @@ -1,1340 +0,0 @@ -DEVICE;TYPEID;M;N;K;S;GFLOPS;BS;BM;BN;BK;WS;WG;LU;NZ;AL;TB;TC;AP;AA;AB;AC -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;1;1;1;30000;0;4;1;1;1;1;1;0;0;0;0;1;0;0;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;2;2;2;30000;0;10;2;1;1;2;-1;1;0;1;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;3;3;1;30000;0;10;3;1;1;3;-1;-1;0;1;0;1;0;0;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;3;3;3;30000;0;10;3;1;1;1;-2;0;0;1;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;4;4;30000;0;15;4;1;1;4;-1;1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;4;5;30000;0;10;4;1;4;1;-2;-2;0;1;0;1;0;2;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;4;7;30000;0;10;4;1;1;1;-1;-1;0;1;0;1;0;2;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;4;9;30000;0;10;4;1;4;1;1;-2;0;0;0;1;0;2;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;4;10;30000;0;10;4;1;2;1;-1;-2;0;0;0;1;0;2;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;4;13;30000;0;8;4;1;1;1;-1;-1;0;1;0;1;0;0;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;4;15;30000;0;8;4;1;1;1;-2;-1;0;1;0;1;0;0;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;4;17;30000;0;8;4;1;1;1;-2;1;0;1;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;4;25;30000;0;8;4;1;1;1;-1;1;0;1;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;4;26;30000;0;8;4;1;1;1;-1;0;0;1;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;4;28;30000;0;8;4;1;1;1;-1;1;0;1;0;1;0;0;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;4;32;30000;0;8;4;1;1;1;1;-1;0;1;0;1;0;0;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;4;45;30000;0;8;4;1;1;4;-2;-1;0;0;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;5;4;30000;0;15;4;1;1;5;-2;0;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;5;5;30000;0;15;4;1;4;5;-1;0;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;5;7;30000;0;15;4;1;3;5;-1;0;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;5;9;30000;0;8;4;1;1;1;1;0;0;0;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;5;13;30000;0;8;4;1;1;1;-2;-1;0;0;0;1;0;2;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;5;17;30000;0;9;4;1;1;5;-1;-2;0;0;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;5;25;30000;0;9;4;1;1;5;1;-1;0;1;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;5;26;30000;0;8;4;1;1;5;0;-1;0;1;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;5;28;30000;0;8;4;1;1;5;-2;0;0;0;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;5;32;30000;0;8;4;1;1;5;-1;0;0;1;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;5;45;30000;0;8;4;1;1;5;1;1;0;0;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;7;4;30000;0;10;4;1;3;1;1;-2;0;1;0;1;0;2;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;7;5;30000;0;10;4;1;3;1;1;-1;0;1;0;1;0;2;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;7;7;30000;0;10;4;1;3;1;1;-1;0;0;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;7;9;30000;0;10;4;1;2;7;1;-2;0;1;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;7;13;30000;0;8;4;1;1;7;-2;-1;0;1;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;7;25;30000;0;8;4;1;1;7;-1;1;0;1;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;7;26;30000;0;15;4;1;1;7;-1;0;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;7;28;30000;0;8;4;1;1;7;0;-1;0;0;0;1;0;0;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;7;32;30000;0;8;4;1;1;7;1;0;0;0;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;7;45;30000;0;8;4;1;1;7;1;1;0;0;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;9;4;30000;0;11;4;1;2;1;-1;0;0;1;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;9;5;30000;0;16;4;1;2;9;-2;-2;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;9;7;30000;0;10;4;1;3;1;1;1;0;0;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;9;9;30000;0;11;4;1;2;1;-1;-1;0;0;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;9;13;30000;0;10;4;1;1;1;1;-2;0;0;0;1;0;0;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;9;25;30000;0;8;4;1;1;9;0;-1;0;0;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;9;26;30000;0;8;4;1;1;9;0;1;0;0;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;9;28;30000;0;8;4;1;1;9;0;-1;0;1;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;9;32;30000;0;8;4;1;1;9;0;-1;0;0;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;9;45;30000;0;4;4;1;1;9;-2;0;0;0;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;10;4;30000;0;15;4;1;2;10;-2;-1;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;10;10;30000;0;10;4;1;2;1;-2;1;0;1;0;1;0;0;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;10;15;30000;0;8;4;1;1;10;-2;-1;0;0;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;13;4;30000;0;15;4;1;3;13;-1;0;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;13;5;30000;0;12;4;1;3;13;-2;-1;0;0;0;1;0;0;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;13;7;30000;0;11;4;1;1;1;1;-1;0;1;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;13;9;30000;0;15;4;1;4;13;1;1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;13;13;30000;0;15;4;1;1;13;-1;1;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;13;17;30000;0;15;4;1;1;13;1;1;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;13;25;30000;0;15;4;1;1;13;-2;1;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;13;26;30000;0;15;4;1;1;13;-1;0;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;13;28;30000;0;8;4;1;1;13;0;0;0;1;0;1;0;2;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;13;32;30000;0;8;4;1;1;13;0;0;0;1;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;13;45;30000;0;8;4;1;1;13;0;1;0;1;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;15;4;30000;0;15;4;1;2;15;-2;1;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;15;10;30000;0;15;4;1;3;15;-1;-2;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;15;15;30000;0;15;4;1;1;15;1;-2;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;17;4;30000;0;12;4;1;3;1;1;0;0;1;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;17;5;30000;0;15;4;1;4;17;-2;1;0;1;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;17;13;30000;0;15;4;1;1;17;1;-2;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;17;17;30000;0;15;4;1;1;17;1;-2;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;17;32;30000;0;8;4;1;1;1;1;0;0;1;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;25;4;30000;0;15;4;1;3;1;-1;1;0;0;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;25;5;30000;0;15;4;1;3;1;-2;-1;0;0;0;1;0;2;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;25;7;30000;0;15;4;1;1;25;-2;-2;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;25;9;30000;0;15;4;1;3;25;-2;-2;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;25;13;30000;0;15;4;1;1;25;-1;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;25;25;30000;0;15;4;1;1;25;-1;-2;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;25;26;30000;0;15;4;1;1;25;-1;1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;25;28;30000;0;15;4;1;1;25;1;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;25;32;30000;0;15;4;1;1;25;-1;-2;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;25;45;30000;0;15;4;1;1;25;1;0;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;26;4;30000;0;15;4;1;2;1;-2;1;0;0;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;26;5;30000;0;15;4;1;1;26;-1;0;0;0;0;1;0;2;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;26;7;30000;0;15;4;1;3;26;1;0;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;26;9;30000;0;15;4;1;2;26;1;-2;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;26;13;30000;0;15;4;1;1;26;-2;-2;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;26;25;30000;0;15;4;1;1;26;1;-2;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;26;26;30000;0;15;4;1;1;26;-2;0;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;26;28;30000;0;15;4;1;1;26;-2;1;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;26;32;30000;0;15;4;1;1;26;0;-1;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;26;45;30000;0;8;4;1;1;26;-2;0;0;1;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;28;4;30000;0;15;4;1;1;1;-1;0;0;0;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;28;5;30000;0;15;4;1;1;28;-2;0;0;1;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;28;7;30000;0;15;4;1;4;28;1;-2;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;28;9;30000;0;16;4;1;3;28;-1;1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;28;13;30000;0;15;4;1;1;28;1;1;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;28;25;30000;0;8;4;1;1;28;0;1;0;1;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;28;26;30000;0;15;4;1;1;28;-2;-1;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;28;28;30000;0;15;4;1;1;28;-1;-1;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;28;32;30000;0;15;4;1;1;28;0;-1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;28;45;30000;0;8;4;1;1;28;0;-1;0;0;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;32;4;30000;0;17;4;1;1;1;0;1;0;1;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;32;5;30000;0;16;4;1;2;1;0;1;0;0;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;32;7;30000;0;15;4;1;4;32;1;1;0;0;0;1;0;0;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;32;9;30000;0;15;4;1;1;32;-1;0;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;32;13;30000;0;15;4;1;1;32;0;-1;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;32;17;30000;0;15;4;1;1;32;-2;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;32;25;30000;0;15;4;1;2;32;-2;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;32;26;30000;0;15;4;1;1;32;-1;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;32;28;30000;0;15;4;1;4;32;0;0;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;32;32;30000;0;8;4;1;1;32;-1;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;32;45;30000;0;8;4;1;1;32;-2;0;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;45;4;30000;0;30;4;1;1;45;0;-1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;45;5;30000;0;15;4;1;4;45;-2;1;0;0;0;1;0;0;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;45;7;30000;0;15;4;1;2;45;-2;-1;0;0;0;1;0;2;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;45;9;30000;0;15;4;1;3;45;0;0;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;45;13;30000;0;6;4;1;1;45;1;0;0;0;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;45;25;30000;0;6;4;1;1;45;1;1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;45;26;30000;0;7;4;1;1;45;-2;-2;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;45;28;30000;0;7;4;1;1;45;-2;-1;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;45;32;30000;0;6;4;1;1;45;1;-2;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;4;45;45;30000;0;5;4;1;1;45;1;1;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;4;4;30000;0;11;5;1;1;1;1;1;0;0;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;4;5;30000;0;12;5;1;1;1;1;1;0;1;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;4;7;30000;0;8;5;1;1;1;1;1;0;0;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;4;9;30000;0;10;5;1;1;1;-1;1;0;0;0;1;0;0;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;4;13;30000;0;8;5;1;1;1;1;0;0;0;0;1;0;2;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;4;17;30000;0;8;5;1;1;1;-1;-2;0;0;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;4;25;30000;0;8;5;1;1;1;0;0;0;0;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;4;26;30000;0;8;5;1;1;5;0;1;0;0;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;4;28;30000;0;8;5;1;1;5;-1;1;0;0;0;1;0;0;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;4;32;30000;0;15;5;1;1;5;-2;-1;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;4;45;30000;0;8;5;1;1;5;-1;-1;0;1;0;1;0;0;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;5;4;30000;0;12;5;1;1;1;1;-2;0;0;0;1;0;0;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;5;5;30000;0;15;5;1;2;5;-1;1;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;5;7;30000;0;10;5;1;1;1;-1;-1;0;1;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;5;9;30000;0;15;5;1;1;5;-2;-1;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;5;13;30000;0;10;5;1;1;1;1;1;0;0;0;1;0;0;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;5;16;30000;0;16;5;1;1;5;-2;-1;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;5;17;30000;0;8;5;1;1;1;-1;-1;0;0;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;5;20;30000;0;8;5;1;1;5;-1;0;0;1;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;5;24;30000;0;8;5;1;1;1;-2;-2;0;0;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;5;26;30000;0;8;5;1;1;1;-2;-2;0;0;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;5;28;30000;0;8;5;1;1;5;1;-2;0;0;0;1;0;2;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;5;32;30000;0;15;5;1;1;5;-2;-1;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;6;20;30000;0;8;5;1;1;6;1;0;0;0;0;1;0;2;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;6;32;30000;0;15;5;1;1;6;1;1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;7;4;30000;0;11;5;1;1;1;-2;1;0;1;0;1;0;2;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;7;5;30000;0;15;5;1;1;7;-1;0;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;7;7;30000;0;10;5;1;1;1;-1;1;0;1;0;1;0;2;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;7;9;30000;0;10;5;1;1;1;-1;-1;0;1;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;7;13;30000;0;8;5;1;1;1;-2;0;0;0;0;1;0;2;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;9;4;30000;0;15;5;1;1;9;-1;0;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;9;5;30000;0;15;5;1;1;9;-2;0;0;0;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;9;7;30000;0;12;5;1;1;1;1;-2;0;1;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;9;9;30000;0;15;5;1;1;9;-2;-1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;13;4;30000;0;15;5;1;1;13;-2;-2;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;13;5;30000;0;15;5;1;1;1;-2;0;0;1;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;13;7;30000;0;15;5;1;1;13;1;-1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;13;13;30000;0;15;5;1;1;13;-2;1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;13;16;30000;0;15;5;1;1;13;-1;-2;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;13;17;30000;0;15;5;1;1;13;-2;-1;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;13;20;30000;0;15;5;1;1;13;1;0;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;13;24;30000;0;15;5;1;1;13;1;1;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;13;26;30000;0;8;5;1;1;1;-2;1;0;0;0;1;0;0;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;13;32;30000;0;15;5;1;1;13;-2;-2;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;13;45;30000;0;8;5;1;1;13;-1;1;0;0;0;1;0;0;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;14;28;30000;0;15;5;1;1;14;-2;-2;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;16;5;30000;0;15;5;1;1;1;-1;0;0;0;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;16;13;30000;0;15;5;1;1;16;-1;-1;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;16;16;30000;0;15;5;1;1;16;1;-2;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;16;24;30000;0;15;5;1;1;16;1;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;16;26;30000;0;15;5;1;1;16;-1;1;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;17;4;30000;0;15;5;1;1;1;-1;0;0;0;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;17;5;30000;0;17;5;1;1;1;-1;-1;0;0;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;17;13;30000;0;15;5;1;1;17;-2;1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;17;17;30000;0;15;5;1;1;17;1;0;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;17;32;30000;0;15;5;1;1;17;-1;0;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;20;5;30000;0;15;5;1;1;20;1;-1;0;1;0;1;0;2;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;20;6;30000;0;15;5;1;1;20;1;0;0;0;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;20;13;30000;0;15;5;1;1;20;1;0;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;20;20;30000;0;15;5;1;1;20;-2;0;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;20;32;30000;0;15;5;1;1;20;1;-1;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;24;5;30000;0;15;5;1;5;1;-1;-1;0;1;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;24;13;30000;0;15;5;1;1;1;0;1;0;0;0;1;0;2;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;24;16;30000;0;15;5;1;1;24;1;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;24;24;30000;0;15;5;1;1;24;1;-2;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;24;26;30000;0;15;5;1;1;24;-1;-2;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;24;32;30000;0;15;5;1;1;24;-2;-2;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;25;4;30000;0;15;5;1;1;25;-2;-2;0;0;0;1;0;0;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;25;5;30000;0;18;5;1;1;25;-1;-1;0;0;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;25;7;30000;0;15;5;1;1;25;1;-2;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;25;9;30000;0;15;5;1;1;25;-2;1;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;25;13;30000;0;15;5;1;1;25;-1;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;25;25;30000;0;15;5;1;1;25;-2;-2;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;25;26;30000;0;15;5;1;1;25;1;-1;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;25;28;30000;0;15;5;1;1;25;0;1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;25;32;30000;0;15;5;1;1;25;-2;1;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;25;45;30000;0;15;5;1;1;25;0;0;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;26;4;30000;0;15;5;1;1;26;-1;-1;0;0;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;26;5;30000;0;15;5;1;1;1;-2;-1;0;0;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;26;7;30000;0;15;5;1;1;26;0;-2;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;26;9;30000;0;15;5;1;1;26;0;0;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;26;13;30000;0;15;5;1;1;26;-2;-2;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;26;16;30000;0;15;5;1;1;26;0;-2;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;26;24;30000;0;15;5;1;1;26;1;-1;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;26;25;30000;0;15;5;1;1;26;-2;1;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;26;26;30000;0;15;5;1;1;26;1;-2;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;26;28;30000;0;15;5;1;1;26;0;0;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;26;32;30000;0;15;5;1;1;26;-1;-1;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;26;45;30000;0;1;5;1;1;26;-1;1;0;1;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;28;4;30000;0;15;5;1;1;28;-2;0;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;28;5;30000;0;15;5;1;3;28;0;1;0;1;0;1;0;0;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;28;7;30000;0;15;5;1;1;28;-1;-1;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;28;9;30000;0;15;5;1;1;28;-2;-1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;28;13;30000;0;15;5;1;1;28;-1;0;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;28;14;30000;0;15;5;1;1;28;-2;-1;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;28;25;30000;0;15;5;1;1;28;-2;-2;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;28;26;30000;0;15;5;1;1;28;0;-2;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;28;28;30000;0;15;5;1;1;28;-2;1;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;28;32;30000;0;15;5;1;1;28;-2;-1;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;28;45;30000;0;15;5;1;1;28;1;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;32;4;30000;0;15;5;1;1;32;1;-2;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;32;5;30000;0;15;5;1;1;32;-2;1;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;32;6;30000;0;25;5;1;1;32;-2;1;0;0;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;32;7;30000;0;15;5;1;4;32;-1;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;32;9;30000;0;15;5;1;2;32;-1;-2;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;32;13;30000;0;15;5;1;1;32;-2;1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;32;17;30000;0;15;5;1;1;32;-1;-2;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;32;20;30000;0;15;5;1;1;32;0;0;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;32;24;30000;0;15;5;1;1;32;1;-2;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;32;25;30000;0;15;5;1;1;32;1;0;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;32;26;30000;0;15;5;1;4;32;1;-1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;32;28;30000;0;15;5;1;1;32;-1;-2;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;32;32;30000;0;15;5;1;1;32;-1;0;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;32;45;30000;0;15;5;1;1;32;1;-1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;45;4;30000;0;30;5;1;1;45;-2;0;0;1;0;1;0;0;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;45;5;30000;0;30;5;1;1;45;0;0;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;45;7;30000;0;30;5;1;1;45;-1;-1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;45;9;30000;0;15;5;1;1;45;-2;-2;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;45;13;30000;0;15;5;1;3;45;-1;-1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;45;25;30000;0;8;5;1;1;45;-1;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;45;26;30000;0;8;5;1;1;45;1;-1;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;45;28;30000;0;8;5;1;1;45;1;-1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;45;32;30000;0;7;5;1;1;45;-1;0;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;5;45;45;30000;0;7;5;1;1;45;-2;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;6;5;20;30000;0;8;6;1;1;6;0;-1;0;1;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;6;5;32;30000;0;8;6;1;1;6;-2;0;0;0;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;6;6;6;30000;0;8;6;1;2;1;-2;0;0;1;0;1;0;2;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;6;6;7;30000;0;16;6;1;1;6;-2;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;6;6;8;30000;0;15;6;1;1;6;-2;1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;6;6;20;30000;0;15;6;1;1;6;-1;0;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;6;6;32;30000;0;15;6;1;1;6;1;0;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;6;7;6;30000;0;15;6;1;1;7;1;-1;0;0;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;6;7;7;30000;0;15;6;1;1;7;1;0;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;6;7;8;30000;0;15;6;1;1;7;-2;0;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;6;8;6;30000;0;15;6;1;1;1;-1;0;0;0;0;1;0;2;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;6;8;7;30000;0;15;6;1;1;8;-1;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;6;8;8;30000;0;15;6;1;1;8;-2;-1;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;6;13;20;30000;0;15;6;1;1;13;-2;-2;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;6;13;32;30000;0;15;6;1;1;13;-1;1;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;6;20;5;30000;0;15;6;1;6;20;-1;-2;0;1;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;6;20;6;30000;0;22;6;1;1;20;1;1;0;0;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;6;20;13;30000;0;16;6;1;1;20;-2;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;6;20;20;30000;0;15;6;1;1;20;-2;1;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;6;20;32;30000;0;16;6;1;1;20;-2;1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;6;32;5;30000;0;25;6;1;1;32;-1;-2;0;1;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;6;32;6;30000;0;28;6;1;1;32;-1;1;0;1;0;1;0;0;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;6;32;13;30000;0;15;6;1;1;32;-1;-2;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;6;32;20;30000;0;15;6;1;1;32;-2;0;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;6;32;32;30000;0;15;6;1;6;32;1;0;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;4;4;30000;0;15;7;1;1;1;-2;-1;0;0;0;1;0;2;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;4;5;30000;0;11;7;1;1;1;1;-1;0;0;0;1;0;2;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;4;7;30000;0;15;7;1;4;7;-2;0;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;4;9;30000;0;15;7;1;6;7;-1;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;4;13;30000;0;11;7;1;1;1;1;-2;0;1;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;4;25;30000;0;8;7;1;1;7;-1;-1;0;1;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;4;26;30000;0;8;7;1;1;7;-1;1;0;1;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;4;28;30000;0;8;7;1;1;7;-1;1;0;1;0;1;0;0;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;4;32;30000;0;15;7;1;1;7;-1;0;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;4;45;30000;0;8;7;1;1;7;-2;0;0;0;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;5;4;30000;0;15;7;1;1;7;-2;-1;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;5;5;30000;0;13;7;1;7;1;-1;-2;0;0;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;5;7;30000;0;15;7;1;1;7;1;-2;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;5;9;30000;0;15;7;1;1;7;1;1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;5;13;30000;0;10;7;1;1;1;-1;0;0;1;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;5;25;30000;0;8;7;1;1;7;1;0;0;0;0;1;0;0;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;5;26;30000;0;8;7;1;1;7;1;-2;0;1;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;5;28;30000;0;15;7;1;1;7;1;0;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;5;32;30000;0;15;7;1;1;7;-2;0;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;5;45;30000;0;8;7;1;1;7;1;0;0;0;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;6;6;30000;0;12;7;1;1;1;-2;0;0;0;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;6;7;30000;0;15;7;1;1;7;1;0;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;6;8;30000;0;15;7;1;1;7;-1;0;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;7;4;30000;0;15;7;1;1;7;1;-1;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;7;5;30000;0;16;7;1;1;1;-1;0;0;0;0;1;0;0;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;7;6;30000;0;16;7;1;1;1;1;-1;0;0;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;7;7;30000;0;8;7;1;3;1;1;1;0;1;0;1;0;2;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;7;8;30000;0;15;7;1;1;7;-2;0;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;7;9;30000;0;15;7;1;1;7;1;-1;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;7;13;30000;0;15;7;1;1;7;-2;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;7;25;30000;0;15;7;1;1;7;1;0;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;7;26;30000;0;15;7;1;1;7;-2;-1;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;7;28;30000;0;15;7;1;1;7;1;1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;7;32;30000;0;15;7;1;1;7;-2;1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;7;45;30000;0;15;7;1;1;7;1;1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;8;6;30000;0;15;7;1;1;1;-2;-2;0;0;0;1;0;2;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;8;7;30000;0;15;7;1;7;8;-2;-2;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;8;8;30000;0;15;7;1;1;8;-1;0;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;9;4;30000;0;15;7;1;1;9;-2;1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;9;5;30000;0;15;7;1;1;9;-1;-1;0;1;0;1;0;2;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;9;7;30000;0;15;7;1;1;9;1;0;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;9;9;30000;0;15;7;1;1;9;-1;1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;9;13;30000;0;15;7;1;1;9;1;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;9;25;30000;0;15;7;1;1;9;1;-1;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;9;26;30000;0;15;7;1;1;9;-2;-1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;9;28;30000;0;15;7;1;1;9;-2;-2;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;9;32;30000;0;15;7;1;1;9;-1;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;9;45;30000;0;15;7;1;1;9;1;-2;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;13;4;30000;0;15;7;1;1;13;-2;-2;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;13;5;30000;0;15;7;1;1;1;1;-1;0;1;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;13;7;30000;0;15;7;1;1;13;-1;-2;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;13;13;30000;0;15;7;1;1;13;-2;-1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;32;13;30000;0;25;7;1;1;32;-1;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;32;25;30000;0;15;7;1;1;32;-1;-2;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;32;26;30000;0;15;7;1;1;32;1;0;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;32;28;30000;0;15;7;1;1;32;-1;-1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;32;32;30000;0;15;7;1;1;32;0;1;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;32;45;30000;0;15;7;1;1;32;-2;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;45;4;30000;0;30;7;1;2;45;-1;1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;45;5;30000;0;43;7;1;7;45;1;-1;0;0;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;45;7;30000;0;31;7;1;7;45;-1;-2;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;45;9;30000;0;30;7;1;6;45;1;-2;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;45;13;30000;0;30;7;1;3;45;0;-2;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;45;25;30000;0;10;7;1;1;45;-2;0;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;45;26;30000;0;10;7;1;1;45;-1;-1;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;45;28;30000;0;8;7;1;1;45;1;-1;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;45;32;30000;0;10;7;1;1;45;-1;0;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;7;45;45;30000;0;11;7;1;1;45;0;-1;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;8;6;6;30000;0;13;8;1;2;8;-1;1;0;1;0;1;0;2;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;8;6;7;30000;0;15;8;1;2;8;-2;1;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;8;6;8;30000;0;15;8;1;3;8;1;-2;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;8;7;6;30000;0;13;8;1;7;1;1;0;0;1;0;1;0;2;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;8;7;7;30000;0;15;8;1;4;8;-2;0;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;8;7;8;30000;0;15;8;1;7;8;-2;-2;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;8;8;6;30000;0;15;8;1;1;8;-1;-2;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;8;8;7;30000;0;15;8;1;1;8;1;0;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;8;8;8;30000;0;4;8;1;5;1;-1;-1;0;1;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;4;4;30000;0;10;1;4;5;1;-2;-1;0;0;0;1;0;2;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;4;5;30000;0;12;9;1;1;1;1;1;0;0;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;4;7;30000;0;15;9;1;1;9;1;1;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;4;9;30000;0;15;9;1;1;9;-1;-2;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;4;13;30000;0;15;9;1;1;9;1;-2;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;4;25;30000;0;15;9;1;1;9;1;0;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;4;26;30000;0;15;9;1;1;9;0;1;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;4;28;30000;0;8;9;1;1;9;-2;-1;0;0;0;1;0;0;1;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;4;32;30000;0;15;9;1;1;9;-2;1;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;4;45;30000;0;15;9;1;1;9;-2;0;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;5;4;30000;0;17;9;1;5;9;-2;1;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;5;5;30000;0;13;9;1;1;1;-2;-1;0;0;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;5;7;30000;0;15;9;1;1;9;1;-2;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;5;9;30000;0;15;9;1;8;9;-1;0;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;5;13;30000;0;15;9;1;1;9;1;0;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;5;25;30000;0;8;9;1;1;9;-2;0;0;0;0;1;0;0;1;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;5;26;30000;0;15;9;1;3;9;-2;1;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;5;28;30000;0;8;9;1;7;9;1;2;0;0;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;5;32;30000;0;15;9;1;1;9;-2;0;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;5;45;30000;0;15;9;1;1;9;-1;0;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;7;4;30000;0;15;9;1;1;9;-2;-2;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;7;5;30000;0;15;9;1;1;9;-1;-2;0;0;0;1;0;2;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;7;7;30000;0;15;9;1;1;9;1;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;7;9;30000;0;15;9;1;1;9;-2;-2;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;7;13;30000;0;15;9;1;1;9;-1;0;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;7;25;30000;0;15;9;1;1;9;1;1;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;7;26;30000;0;15;9;1;8;9;1;0;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;7;28;30000;0;15;9;1;1;9;1;-2;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;7;32;30000;0;8;9;1;1;9;-1;1;0;0;0;1;0;0;1;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;7;45;30000;0;15;9;1;1;9;1;-2;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;9;4;30000;0;15;9;1;1;9;1;1;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;9;5;30000;0;16;9;1;1;1;1;0;0;0;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;9;7;30000;0;15;9;1;1;9;-2;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;9;9;30000;0;8;9;1;1;1;1;-2;0;1;0;1;0;0;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;9;13;30000;0;15;9;1;1;9;1;-2;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;9;16;30000;0;15;9;1;1;9;-1;1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;9;22;30000;0;15;9;1;1;9;-2;1;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;9;25;30000;0;15;9;1;1;9;-1;-1;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;9;26;30000;0;15;9;1;1;9;1;0;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;9;28;30000;0;15;9;1;1;9;-2;-2;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;9;32;30000;0;15;9;1;1;9;1;0;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;9;45;30000;0;15;9;1;1;9;1;0;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;13;4;30000;0;24;9;1;1;13;1;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;13;5;30000;0;15;9;1;1;13;-1;0;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;13;7;30000;0;15;9;1;1;13;-2;-1;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;13;9;30000;0;15;9;1;1;13;-2;-1;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;13;13;30000;0;15;9;1;1;13;-2;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;13;25;30000;0;15;9;1;1;13;-1;-1;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;13;26;30000;0;15;9;1;4;13;-1;-1;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;13;28;30000;0;15;9;1;1;13;-2;1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;13;32;30000;0;8;9;1;1;13;1;-2;0;0;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;13;45;30000;0;15;9;1;1;13;-1;1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;16;9;30000;0;15;9;1;1;16;-1;1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;16;16;30000;0;15;9;1;9;16;-1;0;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;16;22;30000;0;15;9;1;1;1;-2;-1;0;1;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;22;9;30000;0;25;9;1;1;22;-1;0;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;22;16;30000;0;15;9;1;1;22;-1;-2;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;22;22;30000;0;16;9;1;1;22;-1;1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;22;32;30000;0;15;9;1;1;22;1;-1;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;25;4;30000;0;25;9;1;1;25;-1;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;25;5;30000;0;25;9;1;1;25;-1;1;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;25;7;30000;0;25;9;1;1;25;1;1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;25;9;30000;0;15;9;1;1;25;-2;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;25;13;30000;0;15;9;1;1;25;-1;-1;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;25;25;30000;0;15;9;1;1;25;-1;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;25;26;30000;0;15;9;1;1;25;-1;1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;25;28;30000;0;16;9;1;1;25;-1;-2;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;25;32;30000;0;15;9;1;1;25;0;-1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;25;45;30000;0;15;9;1;1;25;-1;0;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;26;4;30000;0;28;9;1;1;26;-1;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;26;5;30000;0;25;9;1;1;26;-1;-2;0;0;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;26;7;30000;0;25;9;1;1;26;-2;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;26;9;30000;0;25;9;1;1;26;-1;1;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;26;13;30000;0;15;9;1;3;26;-2;0;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;26;25;30000;0;15;9;1;1;26;1;0;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;26;26;30000;0;15;9;1;1;26;-1;-2;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;26;28;30000;0;15;9;1;1;26;-1;0;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;26;32;30000;0;15;9;1;1;26;1;0;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;26;45;30000;0;15;9;1;1;26;1;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;28;4;30000;0;25;9;1;1;28;1;-1;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;28;5;30000;0;25;9;1;1;28;-1;0;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;28;7;30000;0;27;9;1;4;28;-2;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;28;9;30000;0;28;9;1;5;28;0;-1;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;28;13;30000;0;15;9;1;2;28;-2;-1;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;28;25;30000;0;15;9;1;1;28;1;0;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;28;26;30000;0;15;9;1;1;28;-1;-2;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;28;28;30000;0;15;9;1;1;28;1;1;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;28;32;30000;0;15;9;1;1;28;0;1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;28;45;30000;0;15;9;1;1;28;-1;1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;32;4;30000;0;25;9;1;1;32;-2;0;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;32;5;30000;0;25;9;1;1;32;0;0;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;32;7;30000;0;25;9;1;1;32;-2;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;32;9;30000;0;25;9;1;1;1;-1;0;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;32;13;30000;0;25;9;1;7;32;1;-2;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;32;22;30000;0;16;9;1;1;1;1;-1;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;32;25;30000;0;16;9;1;1;32;1;0;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;32;26;30000;0;15;9;1;1;32;-2;1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;32;28;30000;0;16;9;1;1;32;-2;0;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;32;32;30000;0;15;9;1;1;1;1;1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;32;45;30000;0;15;9;1;1;32;-2;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;45;32;30000;0;10;9;1;1;45;-1;1;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;9;45;45;30000;0;30;9;1;1;45;1;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;10;4;4;30000;0;16;10;1;1;1;-2;1;0;0;0;1;0;2;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;10;4;10;30000;0;15;10;1;1;10;1;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;10;4;15;30000;0;15;10;1;1;10;-2;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;10;10;4;30000;0;15;10;1;1;10;-2;-1;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;10;10;10;30000;0;8;10;1;1;1;-1;1;0;1;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;10;10;15;30000;0;15;10;1;1;10;-1;-2;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;10;15;4;30000;0;27;10;1;1;15;-2;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;10;15;10;30000;0;15;10;1;1;15;-1;0;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;10;15;15;30000;0;15;10;1;7;15;-1;-2;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;12;12;12;30000;0;8;12;1;1;12;-2;0;0;1;0;1;0;0;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;1;11;30000;0;8;13;1;1;13;-2;-2;0;0;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;4;4;30000;0;18;13;1;1;13;-1;-2;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;4;5;30000;0;15;13;1;1;13;1;0;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;4;7;30000;0;15;13;1;1;13;-1;-1;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;4;9;30000;0;15;13;1;1;13;1;-1;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;4;13;30000;0;9;13;1;1;1;-2;1;0;0;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;4;17;30000;0;15;13;1;1;13;1;0;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;4;25;30000;0;8;13;1;1;13;-2;-2;0;0;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;4;26;30000;0;8;13;1;1;13;-2;-1;0;0;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;4;28;30000;0;15;13;1;1;13;-1;0;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;4;32;30000;0;8;13;1;1;1;-2;-1;0;0;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;4;45;30000;0;8;13;1;1;13;-1;-1;0;0;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;5;4;30000;0;15;13;1;1;13;-1;-2;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;5;5;30000;0;15;13;1;1;13;1;-1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;5;7;30000;0;15;13;1;1;13;1;-1;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;5;9;30000;0;15;13;1;1;13;1;-2;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;5;13;30000;0;10;13;1;1;1;-2;1;0;1;0;1;0;0;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;5;16;30000;0;15;13;1;1;13;-2;-1;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;5;17;30000;0;15;13;1;12;13;-1;1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;5;20;30000;0;15;13;1;1;13;-1;1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;5;24;30000;0;15;13;1;1;13;-2;1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;5;25;30000;0;8;13;1;1;13;1;-2;0;0;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;5;26;30000;0;15;13;1;1;13;-1;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;5;28;30000;0;8;13;1;1;13;-2;0;0;0;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;5;32;30000;0;15;13;1;1;13;1;-2;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;5;45;30000;0;8;13;1;1;13;-1;0;0;0;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;6;20;30000;0;15;13;1;1;13;1;1;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;6;32;30000;0;15;13;1;1;13;-2;-2;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;7;4;30000;0;15;13;1;1;13;-2;-1;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;7;5;30000;0;15;13;1;1;13;-1;1;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;7;7;30000;0;15;13;1;1;13;-1;0;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;7;9;30000;0;15;13;1;1;13;-1;-2;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;7;13;30000;0;10;13;1;1;1;-2;-2;0;1;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;7;25;30000;0;15;13;1;1;13;-2;-2;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;7;26;30000;0;8;13;1;1;13;1;0;0;0;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;7;28;30000;0;16;13;1;1;13;1;-1;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;7;32;30000;0;8;13;1;1;13;1;1;0;0;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;7;45;30000;0;15;13;1;1;13;-1;1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;9;4;30000;0;15;13;1;1;13;-1;-2;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;9;5;30000;0;15;13;1;1;13;1;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;9;7;30000;0;15;13;1;1;13;-2;1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;9;9;30000;0;15;13;1;1;13;-1;1;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;9;13;30000;0;15;13;1;1;13;-1;0;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;9;25;30000;0;15;13;1;1;13;-2;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;9;26;30000;0;15;13;1;1;13;-2;-2;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;9;28;30000;0;15;13;1;1;13;-2;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;9;32;30000;0;15;13;1;1;13;-1;-2;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;9;45;30000;0;15;13;1;1;13;-2;1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;13;4;30000;0;28;13;1;1;1;1;0;0;0;0;1;0;0;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;13;5;30000;0;25;13;1;1;13;-2;-1;0;1;0;1;0;0;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;13;7;30000;0;15;13;1;1;13;-1;1;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;13;9;30000;0;15;13;1;1;13;-1;0;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;13;13;30000;0;8;13;1;10;1;1;0;0;1;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;13;14;30000;0;15;13;1;1;13;-1;-2;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;13;17;30000;0;15;13;1;1;13;-2;0;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;13;20;30000;0;15;13;1;1;13;1;1;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;13;24;30000;0;15;13;1;1;13;-2;0;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;13;25;30000;0;15;13;1;1;13;-2;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;13;26;30000;0;25;13;1;1;13;-2;-2;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;13;28;30000;0;15;13;1;1;13;-1;0;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;13;32;30000;0;15;13;1;1;13;-1;1;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;13;45;30000;0;15;13;1;8;13;1;0;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;13;72;30000;0;8;13;1;1;13;-2;0;0;1;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;13;81;30000;0;8;13;1;1;13;-1;-1;0;1;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;14;13;30000;0;15;13;1;1;14;-2;-2;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;14;14;30000;0;15;13;1;1;14;-2;0;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;14;25;30000;0;15;13;1;1;14;-2;-2;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;14;26;30000;0;15;13;1;1;14;-1;-1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;14;32;30000;0;15;13;1;1;14;1;1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;16;5;30000;0;25;13;1;1;16;-2;0;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;17;4;30000;0;25;13;1;1;17;-2;-2;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;17;5;30000;0;15;13;1;11;17;-1;1;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;17;13;30000;0;16;13;1;1;17;0;0;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;17;17;30000;0;15;13;1;4;17;-1;0;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;17;32;30000;0;15;13;1;1;17;-2;0;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;20;5;30000;0;25;13;1;1;20;0;0;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;20;6;30000;0;25;13;1;12;20;1;-1;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;20;13;30000;0;16;13;1;1;20;-1;0;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;20;20;30000;0;16;13;1;1;20;0;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;20;32;30000;0;15;13;1;1;20;0;0;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;24;5;30000;0;25;13;1;2;24;0;-1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;24;13;30000;0;15;13;1;10;24;-2;-1;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;24;24;30000;0;15;13;1;1;24;0;0;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;24;26;30000;0;15;13;1;1;24;-1;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;24;32;30000;0;15;13;1;1;24;0;1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;25;4;30000;0;25;13;1;1;25;-1;0;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;25;5;30000;0;25;13;1;1;25;-2;-1;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;25;7;30000;0;25;13;1;1;25;-2;0;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;25;9;30000;0;25;13;1;1;25;0;-1;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;25;13;30000;0;16;13;1;1;25;1;1;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;25;14;30000;0;15;13;1;4;25;-1;1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;25;25;30000;0;6;8;1;5;25;1;-2;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;25;26;30000;0;15;13;1;1;25;0;-2;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;25;28;30000;0;16;13;1;1;25;-1;0;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;25;32;30000;0;15;13;1;2;25;1;-2;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;25;45;30000;0;15;13;1;1;25;0;0;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;26;4;30000;0;25;13;1;1;26;0;-1;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;26;5;30000;0;25;13;1;10;26;0;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;26;7;30000;0;28;13;1;1;26;-2;1;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;26;9;30000;0;25;13;1;1;26;1;0;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;26;13;30000;0;16;13;1;4;26;-1;-2;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;26;14;30000;0;25;13;1;1;26;0;0;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;26;24;30000;0;15;13;1;1;26;1;1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;26;25;30000;0;15;13;1;1;26;0;-2;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;26;26;30000;0;15;13;1;1;26;1;0;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;26;28;30000;0;15;13;1;1;26;-2;1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;26;32;30000;0;15;13;1;1;26;1;1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;26;45;30000;0;15;13;1;1;26;0;1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;28;4;30000;0;25;13;1;1;28;0;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;28;5;30000;0;30;13;1;1;28;-1;1;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;28;7;30000;0;25;13;1;1;28;-1;-2;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;28;9;30000;0;25;13;1;1;28;0;-1;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;28;13;30000;0;16;13;1;10;28;-1;-1;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;28;25;30000;0;15;13;1;1;28;-2;1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;28;26;30000;0;15;13;1;1;28;0;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;28;28;30000;0;15;13;1;1;28;0;1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;28;32;30000;0;15;13;1;1;28;1;-2;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;28;45;30000;0;15;13;1;1;28;0;1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;32;4;30000;0;31;13;1;13;32;-1;0;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;32;5;30000;0;30;13;1;5;32;-2;1;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;32;6;30000;0;25;13;1;1;32;0;1;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;32;7;30000;0;25;13;1;10;32;-1;1;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;32;9;30000;0;25;13;1;1;32;-1;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;32;13;30000;0;25;13;1;1;32;0;0;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;32;14;30000;0;25;13;1;1;32;1;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;32;17;30000;0;25;13;1;1;32;1;-1;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;32;20;30000;0;25;13;1;1;32;1;-2;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;32;24;30000;0;15;13;1;1;32;0;-1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;32;25;30000;0;15;13;1;1;32;-1;1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;32;26;30000;0;15;13;1;1;32;1;-1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;32;28;30000;0;16;13;1;1;32;1;-1;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;32;32;30000;0;15;13;1;1;1;-2;0;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;32;45;30000;0;15;13;1;1;32;1;0;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;45;4;30000;0;32;13;1;9;45;-1;0;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;45;5;30000;0;32;13;1;10;45;-2;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;45;7;30000;0;37;13;1;6;45;1;0;0;0;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;45;9;30000;0;30;13;1;9;45;1;1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;45;13;30000;0;30;13;1;1;45;1;-2;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;45;25;30000;0;8;8;1;3;45;-1;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;45;26;30000;0;15;13;1;1;45;1;-2;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;45;28;30000;0;8;8;1;4;45;1;1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;45;32;30000;0;8;8;1;3;45;-1;0;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;13;45;45;30000;0;30;13;1;1;45;-2;1;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;14;5;28;30000;0;15;14;1;1;14;-2;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;14;13;13;30000;0;15;14;1;1;14;-2;-1;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;14;13;14;30000;0;15;14;1;10;14;-1;1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;14;13;25;30000;0;15;14;1;1;14;-2;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;14;13;26;30000;0;8;14;1;1;14;-1;-2;0;1;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;14;13;32;30000;0;15;14;1;1;14;0;0;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;14;14;13;30000;0;25;14;1;1;14;1;0;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;14;14;14;30000;0;15;14;1;13;14;0;-2;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;14;14;16;30000;0;15;14;1;1;14;-2;-2;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;14;14;25;30000;0;15;14;1;1;14;1;0;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;14;14;26;30000;0;15;14;1;1;14;-2;1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;14;14;28;30000;0;15;14;1;1;14;1;0;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;14;14;29;30000;0;15;14;1;1;14;-2;-1;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;14;14;32;30000;0;15;14;1;1;14;-2;0;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;14;16;14;30000;0;15;14;1;1;16;-1;1;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;14;16;16;30000;0;15;14;1;10;16;-2;1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;14;16;29;30000;0;15;14;1;1;16;1;1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;14;25;13;30000;0;16;14;1;12;25;-1;1;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;14;25;14;30000;0;16;14;1;12;25;-2;0;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;14;25;25;30000;0;15;14;1;1;25;-1;0;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;14;25;26;30000;0;16;14;1;1;25;-2;-2;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;14;25;32;30000;0;15;14;1;1;25;-2;-2;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;14;26;13;30000;0;25;14;1;1;26;0;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;14;26;14;30000;0;25;14;1;1;26;1;1;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;14;26;25;30000;0;15;14;1;1;26;1;0;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;14;26;26;30000;0;15;14;1;1;26;-2;0;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;14;26;32;30000;0;15;14;1;1;26;-1;-1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;14;28;5;30000;0;25;14;1;1;28;-1;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;14;28;14;30000;0;25;14;1;1;28;1;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;14;28;28;30000;0;15;14;1;1;28;1;1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;14;29;14;30000;0;25;14;1;1;29;-1;1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;14;29;16;30000;0;15;14;1;12;29;-1;0;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;14;29;29;30000;0;15;14;1;1;29;-2;0;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;14;29;32;30000;0;15;14;1;1;29;1;1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;14;32;13;30000;0;25;14;1;1;32;-2;1;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;14;32;14;30000;0;27;14;1;1;32;-2;0;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;14;32;25;30000;0;15;14;1;1;32;-2;-2;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;14;32;26;30000;0;15;14;1;1;32;0;-1;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;14;32;29;30000;0;16;14;1;1;32;1;-2;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;14;32;32;30000;0;15;14;1;1;32;-1;-1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;15;4;4;30000;0;15;15;1;1;15;-2;-2;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;15;4;10;30000;0;15;15;1;12;15;1;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;15;4;15;30000;0;16;15;1;7;15;-2;-1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;15;10;4;30000;0;15;15;1;1;15;-1;-2;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;15;10;10;30000;0;15;15;1;4;15;-2;0;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;15;10;15;30000;0;15;15;1;2;15;-2;-1;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;15;15;4;30000;0;30;15;1;1;15;-1;-2;0;0;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;15;15;10;30000;0;15;15;1;3;15;-2;-1;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;15;15;15;30000;0;15;15;1;8;15;0;-2;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;16;5;5;30000;0;15;16;1;11;16;0;1;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;16;5;13;30000;0;15;16;1;14;16;-1;1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;16;5;16;30000;0;15;16;1;5;16;-1;1;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;16;5;24;30000;0;8;16;1;1;1;-1;-2;0;0;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;16;5;26;30000;0;15;16;1;1;16;1;0;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;16;7;3;30000;0;18;16;1;15;1;-1;-1;0;0;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;16;9;9;30000;0;15;16;1;12;16;-2;1;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;16;9;16;30000;0;15;16;1;11;16;-1;1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;16;9;22;30000;0;15;16;1;1;16;-2;-1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;16;13;5;30000;0;23;16;1;12;1;-2;0;0;0;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;16;14;14;30000;0;15;16;1;1;16;1;-1;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;16;14;16;30000;0;15;16;1;15;16;1;0;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;16;14;29;30000;0;15;16;1;1;16;-2;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;16;16;5;30000;0;30;16;1;1;1;-2;1;0;1;0;1;0;0;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;16;16;9;30000;0;25;16;1;1;16;1;0;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;16;16;14;30000;0;25;16;1;1;16;-2;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;16;16;16;30000;0;15;16;1;1;16;-2;0;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;16;16;22;30000;0;15;16;1;1;1;-1;-2;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;16;16;29;30000;0;25;16;1;1;16;1;1;0;0;0;1;0;0;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;16;16;55;30000;0;8;16;1;1;16;-2;-2;0;1;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;16;22;9;30000;0;25;16;1;6;22;1;0;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;16;22;16;30000;0;17;16;1;1;22;0;1;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;16;22;22;30000;0;15;16;1;1;22;-2;-2;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;16;24;5;30000;0;28;16;1;5;24;-2;1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;16;26;5;30000;0;30;16;1;5;26;1;-1;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;16;29;14;30000;0;25;16;1;1;29;1;-2;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;16;29;16;30000;0;25;16;1;1;29;-2;-1;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;16;29;29;30000;0;15;16;1;1;29;0;0;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;16;29;55;30000;0;15;16;1;1;29;-1;1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;16;55;16;30000;0;30;16;1;1;55;-2;1;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;16;55;29;30000;0;30;16;1;1;55;0;1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;16;55;55;30000;0;30;16;1;1;55;0;0;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;17;1;1;30000;0;15;17;1;2;17;1;-2;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;17;4;4;30000;0;15;17;1;1;17;1;1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;17;4;5;30000;0;15;17;1;1;17;-1;0;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;17;4;13;30000;0;15;17;1;1;17;-2;1;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;17;4;17;30000;0;8;17;1;1;1;-2;-1;0;1;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;17;4;32;30000;0;8;17;1;1;1;1;0;0;0;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;17;5;4;30000;0;15;17;1;1;17;-1;0;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;17;5;5;30000;0;15;17;1;1;17;-1;1;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;17;5;13;30000;0;15;17;1;14;17;-1;-2;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;17;5;17;30000;0;8;17;1;1;1;-1;-2;0;1;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;17;5;32;30000;0;8;17;1;1;1;-2;0;0;0;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;17;13;4;30000;0;25;17;1;13;17;-2;0;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;17;13;5;30000;0;25;17;1;1;17;-1;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;17;13;13;30000;0;15;17;1;1;17;-2;-1;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;17;13;17;30000;0;10;17;1;1;1;-1;1;0;0;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;17;13;32;30000;0;8;17;1;1;1;-1;1;0;1;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;17;17;4;30000;0;25;17;1;1;17;-2;1;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;17;17;5;30000;0;25;17;1;1;17;1;1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;17;17;13;30000;0;25;17;1;1;17;-1;-2;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;17;17;17;30000;0;15;17;1;1;17;-2;-2;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;17;17;32;30000;0;15;17;1;1;1;-1;-1;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;17;17;35;30000;0;15;17;1;1;1;-2;1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;17;32;4;30000;0;41;17;1;4;32;0;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;17;32;5;30000;0;41;17;1;1;32;1;-2;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;17;32;13;30000;0;25;17;1;1;32;-2;-2;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;17;32;17;30000;0;25;17;1;1;1;0;0;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;17;32;32;30000;0;17;17;1;1;1;0;-1;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;17;32;35;30000;0;15;17;1;1;1;-1;-2;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;17;35;17;30000;0;30;17;1;1;1;0;1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;17;35;32;30000;0;30;17;1;1;1;-1;-2;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;17;35;35;30000;0;30;17;1;1;1;-1;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;20;20;5;30000;0;28;20;1;13;20;1;0;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;20;20;6;30000;0;30;20;1;1;20;-2;0;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;20;20;20;30000;0;25;20;1;1;20;-2;-2;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;20;20;32;30000;0;15;20;1;1;20;-2;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;20;32;5;30000;0;50;20;1;10;32;-1;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;20;32;6;30000;0;43;20;1;18;32;-1;-1;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;20;32;13;30000;0;14;20;1;8;32;0;3;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;20;32;20;30000;0;25;20;1;1;32;-1;-2;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;20;32;32;30000;0;15;20;1;1;32;-2;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;22;9;9;30000;0;15;22;1;1;22;-2;-1;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;22;9;16;30000;0;15;22;1;7;22;1;3;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;22;9;22;30000;0;15;22;1;1;22;-2;-2;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;22;9;32;30000;0;8;22;1;1;1;-1;1;0;1;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;22;16;9;30000;0;15;22;1;1;22;1;-1;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;22;16;16;30000;0;15;22;1;11;22;-1;-1;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;22;16;22;30000;0;15;22;1;1;22;1;0;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;22;22;9;30000;0;28;22;1;1;22;-1;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;22;22;16;30000;0;25;22;1;1;22;-2;-2;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;22;22;22;30000;0;16;22;1;1;1;-2;1;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;22;22;32;30000;0;15;22;1;1;1;-2;1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;22;32;9;30000;0;25;22;1;1;1;-1;1;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;22;32;22;30000;0;15;22;1;1;1;1;1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;22;32;32;30000;0;15;22;1;5;1;-2;0;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;23;23;23;30000;0;15;23;1;1;1;-1;0;0;0;0;1;0;1;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;24;5;5;30000;0;15;24;1;10;24;-2;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;24;5;13;30000;0;15;8;1;6;1;-2;-1;0;0;0;1;0;2;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;24;5;16;30000;0;15;24;1;6;24;-1;3;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;24;5;24;30000;0;15;24;1;13;24;-1;3;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;24;5;26;30000;0;15;8;1;17;24;-2;3;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;24;5;32;30000;0;8;8;1;1;24;0;-1;0;0;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;24;13;5;30000;0;20;24;1;2;1;-2;-1;0;0;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;24;13;13;30000;0;15;24;1;1;24;-1;1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;24;13;24;30000;0;9;8;1;10;24;-2;-1;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;24;13;26;30000;0;15;24;1;1;24;-2;0;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;24;13;32;30000;0;6;8;1;1;24;-2;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;24;16;5;30000;0;25;24;1;8;1;-2;-1;0;0;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;24;24;5;30000;0;46;24;1;1;24;1;1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;24;24;13;30000;0;27;24;1;1;24;-1;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;24;24;24;30000;0;15;24;1;1;1;-2;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;24;24;26;30000;0;15;24;1;1;1;-2;-2;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;24;24;32;30000;0;15;24;1;1;1;-2;0;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;24;26;5;30000;0;28;24;1;19;26;-1;-2;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;24;26;13;30000;0;16;24;1;1;26;1;-2;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;24;26;24;30000;0;12;8;1;13;1;1;0;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;24;26;26;30000;0;15;24;1;1;26;-1;-1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;24;26;32;30000;0;7;24;1;12;26;-1;3;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;24;32;5;30000;0;41;24;1;3;32;-2;1;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;24;32;13;30000;0;15;24;1;1;32;-2;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;24;32;24;30000;0;15;24;1;9;1;-1;-1;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;24;32;26;30000;0;7;8;1;14;32;0;-2;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;24;32;32;30000;0;7;8;1;1;1;-1;-2;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;4;4;30000;0;15;25;1;7;25;1;1;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;4;5;30000;0;15;25;1;1;25;0;1;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;4;7;30000;0;15;25;1;7;25;1;4;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;4;9;30000;0;15;8;1;25;25;0;1;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;4;13;30000;0;15;25;1;9;25;1;4;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;4;25;30000;0;15;25;1;1;25;0;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;4;26;30000;0;15;25;1;7;25;-1;3;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;4;28;30000;0;15;25;1;1;25;-2;1;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;4;32;30000;0;15;25;1;24;25;1;4;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;4;45;30000;0;15;25;1;1;25;1;0;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;5;4;30000;0;15;25;1;2;1;1;0;0;1;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;5;5;30000;0;15;25;1;1;25;-1;1;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;5;7;30000;0;15;25;1;25;25;-2;4;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;5;9;30000;0;15;25;1;16;25;-1;3;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;5;13;30000;0;15;25;1;1;25;-1;-2;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;5;25;30000;0;15;8;1;19;25;1;1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;5;26;30000;0;15;25;1;11;25;-1;4;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;5;28;30000;0;15;25;1;1;25;0;1;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;5;32;30000;0;15;8;1;25;25;-1;-1;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;5;45;30000;0;8;25;1;1;25;0;-1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;7;4;30000;0;15;25;1;21;25;-1;0;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;7;5;30000;0;15;25;1;1;25;-2;-1;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;7;7;30000;0;16;25;1;4;25;1;4;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;7;9;30000;0;8;8;1;1;25;0;4;0;1;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;7;13;30000;0;15;8;1;7;25;1;3;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;7;25;30000;0;15;25;1;1;25;-1;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;7;26;30000;0;16;25;1;1;25;-2;1;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;7;28;30000;0;15;25;1;9;25;1;3;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;7;32;30000;0;15;25;1;21;25;-1;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;7;45;30000;0;15;25;1;1;25;0;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;9;4;30000;0;15;25;1;1;25;-1;-1;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;9;5;30000;0;15;25;1;1;25;-1;-1;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;9;7;30000;0;10;25;1;23;25;-1;4;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;9;9;30000;0;10;25;1;23;25;1;3;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;9;13;30000;0;15;25;1;1;25;1;-2;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;9;25;30000;0;6;8;1;11;25;-2;4;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;9;26;30000;0;5;8;1;21;25;-2;3;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;9;28;30000;0;4;25;1;3;25;-2;3;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;9;32;30000;0;15;25;1;1;25;1;0;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;9;45;30000;0;15;25;1;1;25;1;0;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;13;4;30000;0;25;25;1;11;25;1;-2;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;13;5;30000;0;15;25;1;6;25;-1;1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;13;7;30000;0;30;25;1;3;25;0;4;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;13;9;30000;0;15;8;1;1;25;-1;-1;0;1;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;13;13;30000;0;15;25;1;1;25;-2;-1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;13;14;30000;0;15;25;1;7;25;0;0;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;13;25;30000;0;10;25;1;23;25;-2;4;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;13;26;30000;0;15;25;1;1;25;-1;0;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;13;28;30000;0;15;25;1;1;25;0;-1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;13;32;30000;0;15;25;1;1;25;1;0;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;13;45;30000;0;15;25;1;1;25;-2;1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;14;13;30000;0;15;25;1;1;25;-1;-1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;14;14;30000;0;8;25;1;7;25;-1;-2;0;1;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;14;25;30000;0;15;25;1;1;25;-1;0;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;14;26;30000;0;15;25;1;1;25;0;-1;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;14;32;30000;0;15;25;1;1;25;1;-2;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;25;4;30000;0;43;25;1;1;25;-2;-1;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;25;5;30000;0;43;25;1;1;25;-1;1;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;25;7;30000;0;41;25;1;1;25;-2;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;25;9;30000;0;25;25;1;1;25;-1;1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;25;13;30000;0;25;25;1;1;25;-1;0;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;25;14;30000;0;25;25;1;1;25;-2;0;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;25;25;30000;0;15;25;1;1;1;-2;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;25;26;30000;0;16;25;1;1;25;-1;0;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;25;28;30000;0;15;25;1;1;25;1;-2;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;25;32;30000;0;15;25;1;1;25;-1;0;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;25;45;30000;0;15;25;1;1;25;-2;-2;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;26;4;30000;0;30;25;1;2;26;1;1;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;26;5;30000;0;30;25;1;4;26;-1;-2;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;26;7;30000;0;17;25;1;12;26;-1;3;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;26;9;30000;0;16;16;1;7;26;-2;0;0;0;0;1;0;1;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;26;13;30000;0;17;25;1;1;26;-1;0;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;26;14;30000;0;15;25;1;1;26;1;1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;26;25;30000;0;15;25;1;1;26;-1;-2;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;26;26;30000;0;15;25;1;1;26;1;-1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;26;28;30000;0;7;8;1;14;26;-2;3;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;26;32;30000;0;15;25;1;1;26;1;-2;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;26;45;30000;0;1;25;1;25;26;0;-1;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;28;4;30000;0;30;25;1;2;28;0;1;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;28;5;30000;0;30;25;1;3;28;-2;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;28;7;30000;0;14;25;1;5;28;-1;4;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;28;9;30000;0;13;25;1;15;28;0;3;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;28;13;30000;0;15;25;1;1;28;0;1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;28;25;30000;0;15;25;1;1;28;-2;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;28;26;30000;0;16;25;1;1;28;-2;-2;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;28;28;30000;0;15;25;1;1;28;-2;-1;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;28;32;30000;0;15;25;1;1;28;-1;0;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;28;45;30000;0;15;25;1;1;28;-1;1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;32;4;30000;0;30;25;1;6;32;-2;-2;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;32;5;30000;0;30;25;1;1;32;-2;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;32;7;30000;0;59;25;1;3;32;-2;4;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;32;9;30000;0;14;25;1;3;32;-2;3;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;32;13;30000;0;15;25;1;1;32;-1;-2;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;32;14;30000;0;15;25;1;1;32;-2;0;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;32;25;30000;0;15;25;1;1;32;-1;-2;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;32;26;30000;0;15;25;1;1;32;-2;-2;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;32;28;30000;0;15;25;1;1;32;-1;0;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;32;32;30000;0;15;25;1;1;32;-2;1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;32;45;30000;0;1;25;1;23;32;-1;-2;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;45;4;30000;0;50;25;1;18;45;-2;-2;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;45;5;30000;0;50;25;1;1;45;-2;0;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;45;7;30000;0;22;25;1;20;45;-2;4;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;45;9;30000;0;14;25;1;23;45;1;3;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;45;13;30000;0;31;25;1;1;45;-1;0;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;45;25;30000;0;30;25;1;1;45;0;0;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;45;26;30000;0;8;16;1;8;45;1;3;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;45;28;30000;0;5;16;1;22;45;-1;-1;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;45;32;30000;0;30;25;1;1;45;-2;0;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;25;45;45;30000;0;30;25;1;1;45;-2;-1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;4;4;30000;0;15;26;1;26;1;-1;-1;0;0;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;4;5;30000;0;15;26;1;18;26;0;4;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;4;7;30000;0;15;8;1;21;26;-2;0;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;4;9;30000;0;15;26;1;9;26;0;4;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;4;13;30000;0;15;26;1;2;26;0;4;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;4;25;30000;0;16;26;1;14;26;-2;3;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;4;26;30000;0;15;8;1;26;26;-1;3;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;4;28;30000;0;15;26;1;1;26;-1;-2;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;4;32;30000;0;16;26;1;1;26;1;1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;4;45;30000;0;1;26;1;20;26;0;3;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;5;4;30000;0;15;26;1;1;26;1;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;5;5;30000;0;13;26;1;1;1;-1;-2;0;0;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;5;7;30000;0;16;26;1;17;26;-1;4;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;5;9;30000;0;16;26;1;13;26;0;4;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;5;13;30000;0;8;26;1;1;1;-1;0;0;0;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;5;16;30000;0;15;8;1;9;26;-1;3;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;5;24;30000;0;15;8;1;26;26;-2;0;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;5;25;30000;0;15;26;1;1;26;-2;-2;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;5;26;30000;0;15;8;1;25;26;-2;4;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;5;28;30000;0;15;8;1;26;26;0;3;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;5;32;30000;0;15;8;1;8;26;0;4;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;5;45;30000;0;15;26;1;1;26;1;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;7;4;30000;0;15;26;1;13;26;1;0;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;7;5;30000;0;15;26;1;1;26;1;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;7;7;30000;0;16;26;1;20;26;-2;4;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;7;9;30000;0;15;26;1;9;26;-1;4;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;7;13;30000;0;8;8;1;1;26;0;0;0;0;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;7;25;30000;0;15;26;1;1;26;1;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;7;26;30000;0;15;26;1;1;26;-2;-1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;7;28;30000;0;15;26;1;1;26;1;1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;7;32;30000;0;15;26;1;1;26;1;1;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;7;45;30000;0;1;26;1;25;26;-2;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;9;4;30000;0;15;26;1;21;26;0;1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;9;5;30000;0;15;26;1;1;26;1;0;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;9;7;30000;0;13;8;1;12;26;1;3;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;9;9;30000;0;12;26;1;11;26;-1;4;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;9;13;30000;0;10;8;1;14;26;-1;1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;9;25;30000;0;6;26;1;17;26;-1;4;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;9;26;30000;0;6;8;1;19;26;-1;3;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;9;28;30000;0;15;26;1;1;26;-1;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;9;32;30000;0;15;26;1;1;26;-2;-2;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;9;45;30000;0;15;26;1;1;26;-1;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;13;4;30000;0;25;26;1;7;26;0;0;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;13;5;30000;0;25;26;1;1;1;-1;-2;0;0;0;1;0;0;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;13;7;30000;0;30;26;1;11;26;-1;4;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;13;9;30000;0;15;8;1;26;26;1;-1;0;0;0;1;0;1;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;13;13;30000;0;15;26;1;1;26;-2;0;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;13;14;30000;0;15;26;1;1;26;-1;-2;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;13;24;30000;0;15;26;1;1;26;0;0;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;13;25;30000;0;16;26;1;1;26;-2;-2;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;13;26;30000;0;15;26;1;7;26;0;-2;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;13;28;30000;0;15;26;1;1;26;-1;0;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;13;32;30000;0;15;26;1;1;26;1;0;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;13;45;30000;0;15;26;1;1;26;1;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;14;13;30000;0;15;26;1;1;26;-1;0;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;14;14;30000;0;15;26;1;1;26;0;-1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;14;25;30000;0;15;26;1;1;26;1;-2;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;14;26;30000;0;15;26;1;1;26;-2;-2;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;14;32;30000;0;15;26;1;1;26;-1;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;16;5;30000;0;25;26;1;1;1;-1;-1;0;0;0;1;0;0;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;24;5;30000;0;27;26;1;1;26;-2;1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;24;13;30000;0;17;26;1;1;26;-1;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;24;24;30000;0;15;26;1;1;26;0;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;24;26;30000;0;16;26;1;1;1;1;0;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;24;32;30000;0;15;26;1;1;26;-2;-2;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;25;4;30000;0;30;26;1;26;26;-1;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;25;5;30000;0;28;26;1;1;26;1;0;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;25;7;30000;0;17;8;1;2;26;0;-2;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;25;9;30000;0;15;26;1;20;26;0;-1;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;25;13;30000;0;15;26;1;1;26;-2;0;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;25;14;30000;0;16;26;1;1;26;-1;0;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;25;25;30000;0;15;26;1;1;26;-1;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;25;26;30000;0;15;26;1;1;26;0;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;25;28;30000;0;5;16;1;21;26;1;1;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;25;32;30000;0;15;26;1;1;26;-2;0;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;25;45;30000;0;4;8;1;13;26;0;1;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;26;4;30000;0;45;26;1;1;26;-2;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;26;5;30000;0;46;26;1;1;26;-1;-2;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;26;7;30000;0;30;26;1;1;26;1;0;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;26;9;30000;0;25;26;1;1;26;-1;-2;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;26;13;30000;0;25;26;1;1;26;1;-2;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;26;14;30000;0;17;26;1;1;26;0;-1;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;26;24;30000;0;15;26;1;20;1;0;0;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;26;25;30000;0;16;26;1;1;26;-1;1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;26;26;30000;0;17;26;1;1;1;-2;0;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;26;28;30000;0;15;26;1;1;26;-2;0;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;26;32;30000;0;15;26;1;1;1;1;0;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;26;45;30000;0;15;26;1;1;26;-2;-1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;28;4;30000;0;45;26;1;22;28;-2;1;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;28;5;30000;0;30;26;1;1;28;-1;0;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;28;7;30000;0;17;26;1;7;28;-2;4;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;28;9;30000;0;15;26;1;20;28;0;-1;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;28;13;30000;0;15;26;1;1;28;-1;-2;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;28;25;30000;0;15;26;1;1;28;1;1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;28;26;30000;0;15;26;1;1;28;1;0;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;28;28;30000;0;30;16;1;7;28;-2;1;0;0;0;1;0;1;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;28;32;30000;0;15;26;1;1;28;0;1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;28;45;30000;0;15;26;1;1;28;-1;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;32;4;30000;0;50;26;1;3;32;0;1;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;32;5;30000;0;43;26;1;1;32;1;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;32;7;30000;0;59;26;1;20;32;-1;3;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;32;9;30000;0;15;26;1;14;32;0;0;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;32;13;30000;0;18;26;1;1;32;0;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;32;14;30000;0;18;26;1;1;32;-2;1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;32;24;30000;0;15;26;1;1;32;0;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;32;25;30000;0;15;26;1;1;32;-1;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;32;26;30000;0;7;8;1;17;32;-2;-2;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;32;28;30000;0;16;26;1;1;32;0;-2;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;32;32;30000;0;15;26;1;1;32;-1;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;32;45;30000;0;15;26;1;1;32;-2;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;45;4;30000;0;62;26;1;12;45;-1;-2;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;45;5;30000;0;54;26;1;1;45;-2;0;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;45;7;30000;0;24;26;1;19;45;1;3;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;45;9;30000;0;30;26;1;18;45;1;0;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;45;13;30000;0;30;26;1;1;45;1;0;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;45;25;30000;0;10;26;1;1;45;1;0;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;45;26;30000;0;30;26;1;1;45;-2;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;45;28;30000;0;30;26;1;1;45;1;0;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;45;32;30000;0;5;16;1;23;45;-2;-2;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;26;45;45;30000;0;30;26;1;1;45;-2;-1;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;4;4;30000;0;16;28;1;7;1;-2;4;0;0;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;4;5;30000;0;15;8;1;23;28;-2;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;4;7;30000;0;15;8;1;13;28;-2;0;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;4;9;30000;0;15;28;1;11;28;-1;4;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;4;13;30000;0;16;8;1;15;28;-1;4;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;4;25;30000;0;15;8;1;15;28;-2;4;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;4;26;30000;0;15;8;1;20;28;-2;4;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;4;28;30000;0;15;28;1;26;28;-1;3;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;4;32;30000;0;15;8;1;16;28;0;0;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;4;45;30000;0;15;28;1;14;28;-1;4;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;5;4;30000;0;15;16;1;6;28;1;4;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;5;5;30000;0;15;8;1;3;28;0;-2;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;5;7;30000;0;16;8;1;6;28;-2;0;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;5;9;30000;0;16;28;1;17;28;1;4;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;5;13;30000;0;15;8;1;27;28;-1;4;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;5;25;30000;0;15;8;1;5;28;0;-2;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;5;26;30000;0;15;8;1;28;28;-2;4;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;5;28;30000;0;15;28;1;11;28;1;4;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;5;32;30000;0;15;28;1;3;28;-1;4;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;5;45;30000;0;1;28;1;10;28;-1;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;7;4;30000;0;17;28;1;15;28;-2;4;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;7;5;30000;0;16;28;1;17;28;0;4;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;7;7;30000;0;15;28;1;27;28;1;4;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;7;9;30000;0;16;28;1;21;28;0;4;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;7;13;30000;0;15;28;1;28;28;-1;4;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;7;25;30000;0;15;8;1;19;28;0;4;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;7;26;30000;0;15;8;1;4;28;-1;4;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;7;28;30000;0;15;8;1;8;28;-2;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;7;32;30000;0;15;28;1;5;28;1;4;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;7;45;30000;0;15;28;1;4;28;-1;4;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;9;4;30000;0;30;28;1;22;28;-2;4;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;9;5;30000;0;15;8;1;1;28;-2;0;0;1;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;9;7;30000;0;13;28;1;20;28;-1;4;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;9;9;30000;0;13;8;1;6;28;1;4;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;9;13;30000;0;10;8;1;19;28;-1;-1;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;9;25;30000;0;7;8;1;22;28;-1;0;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;9;26;30000;0;6;8;1;26;28;0;4;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;9;28;30000;0;4;8;1;20;28;1;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;9;32;30000;0;5;8;1;19;28;-2;-2;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;9;45;30000;0;1;28;1;11;28;-2;0;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;13;4;30000;0;30;28;1;20;28;-2;4;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;13;5;30000;0;30;28;1;5;28;-1;4;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;13;7;30000;0;15;8;1;22;28;-1;-2;0;1;0;1;0;1;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;13;9;30000;0;15;8;1;7;28;1;4;0;0;0;1;0;1;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;13;13;30000;0;15;28;1;5;28;0;1;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;13;25;30000;0;10;8;1;27;28;1;1;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;13;26;30000;0;10;8;1;9;28;0;-2;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;13;28;30000;0;15;28;1;2;28;-2;-1;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;13;32;30000;0;15;16;1;15;28;1;-2;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;13;45;30000;0;10;8;1;20;28;-2;0;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;25;4;30000;0;30;8;1;22;28;-1;4;0;0;0;1;0;1;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;25;5;30000;0;59;28;1;15;28;-1;4;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;25;7;30000;0;20;28;1;9;28;-2;4;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;25;9;30000;0;13;8;1;23;28;-2;0;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;25;13;30000;0;15;28;1;5;28;0;1;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;25;25;30000;0;15;28;1;9;28;0;1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;25;26;30000;0;15;28;1;1;28;-2;-2;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;25;28;30000;0;15;28;1;2;28;-2;1;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;25;32;30000;0;15;28;1;3;28;-2;-2;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;25;45;30000;0;1;28;1;14;28;1;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;26;4;30000;0;30;8;1;10;28;0;-2;0;0;0;1;0;1;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;26;5;30000;0;59;28;1;3;28;-2;4;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;26;7;30000;0;59;28;1;9;28;1;4;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;26;9;30000;0;15;8;1;17;28;-2;-2;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;26;13;30000;0;15;28;1;5;28;0;-1;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;26;25;30000;0;15;28;1;25;28;0;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;26;26;30000;0;16;28;1;1;28;-2;0;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;26;28;30000;0;15;28;1;2;28;1;-1;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;26;32;30000;0;15;28;1;3;28;-2;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;26;45;30000;0;1;28;1;13;28;0;-2;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;28;4;30000;0;50;28;1;1;28;-1;1;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;28;5;30000;0;44;28;1;1;28;-1;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;28;7;30000;0;30;28;1;1;28;-2;0;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;28;9;30000;0;31;28;1;1;28;-1;0;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;28;13;30000;0;15;28;1;5;28;0;0;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;28;14;30000;0;15;28;1;1;28;-1;-1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;28;25;30000;0;16;28;1;1;28;-2;1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;28;26;30000;0;15;28;1;1;28;1;0;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;28;28;30000;0;9;16;1;4;1;-1;4;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;28;32;30000;0;15;28;1;3;28;1;-1;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;28;45;30000;0;1;28;1;21;28;-2;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;32;4;30000;0;30;8;1;18;32;0;1;0;0;0;1;0;1;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;32;5;30000;0;60;8;1;19;32;0;4;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;32;7;30000;0;59;8;1;17;32;-2;-1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;32;9;30000;0;59;28;1;9;32;0;4;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;32;13;30000;0;16;28;1;5;32;0;0;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;32;25;30000;0;15;28;1;3;32;0;0;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;32;26;30000;0;16;28;1;1;32;-2;0;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;32;28;30000;0;15;28;1;2;32;-2;0;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;32;32;30000;0;15;28;1;3;32;-2;-2;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;32;45;30000;0;1;28;1;27;32;-1;-2;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;45;4;30000;0;26;8;1;12;45;0;0;0;1;0;1;0;0;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;45;5;30000;0;33;28;1;15;45;0;4;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;45;7;30000;0;19;28;1;10;45;-2;4;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;45;9;30000;0;24;28;1;19;45;1;4;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;45;13;30000;0;30;28;1;5;45;-1;1;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;45;25;30000;0;30;28;1;21;45;0;0;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;45;26;30000;0;31;28;1;1;45;-2;-2;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;45;28;30000;0;25;28;1;11;45;-2;4;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;45;32;30000;0;5;16;1;4;45;1;-2;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;28;45;45;30000;0;6;8;1;1;45;-1;-1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;29;14;14;30000;0;15;29;1;1;29;-2;-1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;29;14;16;30000;0;15;29;1;9;29;0;-2;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;29;14;29;30000;0;15;8;1;29;29;-1;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;29;14;32;30000;0;15;29;1;28;29;-1;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;29;16;14;30000;0;15;29;1;1;29;-2;-2;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;29;16;16;30000;0;15;29;1;5;29;0;0;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;29;16;29;30000;0;15;29;1;8;29;-1;3;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;29;16;55;30000;0;5;16;1;11;29;1;3;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;29;29;14;30000;0;17;29;1;1;29;1;1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;29;29;16;30000;0;15;29;1;3;29;0;-2;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;29;29;29;30000;0;16;29;1;1;29;-1;1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;29;29;32;30000;0;15;29;1;1;29;-2;0;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;29;29;55;30000;0;30;16;1;15;29;-2;3;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;29;32;14;30000;0;18;29;1;1;32;0;-2;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;29;32;29;30000;0;15;29;1;2;32;-2;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;29;32;32;30000;0;15;29;1;3;32;-2;1;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;29;32;55;30000;0;3;29;1;21;32;0;2;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;29;55;16;30000;0;31;29;1;3;55;-2;1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;29;55;29;30000;0;7;29;1;12;55;-1;2;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;29;55;32;30000;0;4;16;1;14;55;-1;3;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;29;55;55;30000;0;20;29;1;25;55;-1;3;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;30;30;30;30000;0;15;30;1;1;30;1;-2;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;30;30;76;30000;0;20;30;1;1;30;-2;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;30;76;30;30000;0;8;30;1;22;76;-1;3;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;30;76;76;30000;0;3;30;1;1;76;0;4;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;4;4;30000;0;15;32;1;2;32;1;4;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;4;5;30000;0;15;8;1;2;1;-1;4;0;1;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;4;7;30000;0;15;8;1;9;32;0;4;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;4;9;30000;0;15;8;1;32;32;-2;-2;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;4;13;30000;0;15;32;1;27;32;0;4;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;4;17;30000;0;16;32;1;21;32;-1;4;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;4;25;30000;0;15;8;1;6;32;-2;4;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;4;26;30000;0;15;32;1;14;32;0;4;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;4;28;30000;0;15;32;1;3;32;-1;-1;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;4;32;30000;0;15;8;1;3;32;-1;-1;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;4;45;30000;0;8;8;1;1;32;-2;-2;0;0;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;5;4;30000;0;15;8;1;20;1;1;-2;0;1;0;1;0;2;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;5;5;30000;0;15;32;1;26;32;-1;3;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;5;7;30000;0;15;32;1;4;32;-2;2;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;5;9;30000;0;15;16;1;18;32;-2;-2;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;5;13;30000;0;15;32;1;8;32;-1;4;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;5;17;30000;0;8;32;1;1;1;-1;1;0;0;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;5;24;30000;0;15;8;1;14;32;-1;4;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;5;25;30000;0;15;8;1;3;32;0;-1;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;5;26;30000;0;15;8;1;4;32;-1;4;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;5;28;30000;0;15;32;1;16;32;1;4;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;5;32;30000;0;8;32;1;1;1;1;-1;0;0;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;5;45;30000;0;8;8;1;1;32;-1;1;0;1;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;7;4;30000;0;15;32;1;12;32;-1;2;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;7;5;30000;0;15;32;1;16;32;-1;2;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;7;7;30000;0;15;32;1;2;32;1;2;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;7;9;30000;0;15;16;1;6;32;-1;2;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;7;13;30000;0;15;8;1;31;32;0;1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;7;25;30000;0;15;8;1;13;32;-2;4;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;7;26;30000;0;15;8;1;7;32;1;1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;7;28;30000;0;15;8;1;6;32;-1;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;7;32;30000;0;15;32;1;8;32;0;4;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;7;45;30000;0;8;8;1;1;32;-2;0;0;0;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;9;4;30000;0;17;8;1;13;32;-2;1;0;1;0;1;0;2;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;9;5;30000;0;16;32;1;17;32;-1;3;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;9;7;30000;0;15;32;1;28;32;-1;2;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;9;9;30000;0;15;32;1;9;32;1;3;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;9;13;30000;0;14;32;1;29;32;-2;4;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;9;22;30000;0;9;8;1;24;32;1;1;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;9;25;30000;0;9;8;1;11;32;1;4;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;9;26;30000;0;9;8;1;7;32;-1;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;9;28;30000;0;7;8;1;19;32;0;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;9;32;30000;0;4;8;1;1;32;1;0;0;0;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;9;45;30000;0;3;8;1;1;32;1;-2;0;1;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;13;4;30000;0;22;32;1;12;1;-2;1;0;1;0;1;0;0;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;13;5;30000;0;15;32;1;21;1;1;1;0;0;0;1;0;2;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;13;7;30000;0;16;8;1;2;32;0;-2;0;1;0;1;0;0;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;13;9;30000;0;15;32;1;8;32;0;3;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;13;13;30000;0;15;32;1;1;1;-1;-2;0;1;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;13;14;30000;0;30;32;1;25;32;-2;4;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;13;17;30000;0;11;32;1;1;1;-2;-1;0;1;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;13;24;30000;0;30;8;1;28;32;-2;4;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;13;25;30000;0;15;32;1;16;32;-1;4;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;13;26;30000;0;30;8;1;31;32;0;0;0;1;0;1;0;1;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;13;28;30000;0;30;8;1;6;32;0;-2;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;13;32;30000;0;10;32;1;1;1;-1;1;0;0;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;13;45;30000;0;5;8;1;1;32;-2;-2;0;0;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;14;13;30000;0;16;32;1;3;32;0;-1;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;14;14;30000;0;15;8;1;14;32;-1;4;0;0;0;1;0;1;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;14;25;30000;0;30;8;1;19;32;-2;-2;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;14;26;30000;0;30;8;1;3;32;1;4;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;14;29;30000;0;30;32;1;23;32;-1;4;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;14;32;30000;0;3;16;1;1;32;1;4;0;1;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;17;4;30000;0;30;16;1;10;32;-2;0;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;17;5;30000;0;30;8;1;24;32;-1;-1;0;0;0;1;0;2;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;17;13;30000;0;15;32;1;3;32;0;1;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;17;17;30000;0;15;32;1;3;1;0;0;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;17;32;30000;0;9;8;1;1;1;0;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;20;5;30000;0;32;32;1;16;32;0;3;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;20;6;30000;0;30;8;1;15;32;0;4;0;1;0;1;0;2;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;20;13;30000;0;15;32;1;3;32;0;0;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;20;20;30000;0;15;32;1;2;32;0;0;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;20;32;30000;0;15;32;1;6;32;-1;1;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;22;9;30000;0;15;32;1;18;32;0;0;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;22;22;30000;0;26;8;1;9;32;0;4;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;22;32;30000;0;15;32;1;6;32;-1;0;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;24;5;30000;0;28;8;1;3;32;-1;4;0;1;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;24;13;30000;0;15;32;1;3;32;0;-1;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;24;24;30000;0;18;32;1;32;32;-2;4;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;24;26;30000;0;12;8;1;1;32;-2;-2;0;1;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;24;32;30000;0;10;8;1;1;1;0;-1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;25;4;30000;0;31;8;1;29;32;-1;-1;0;0;0;1;0;0;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;25;5;30000;0;31;32;1;3;32;0;3;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;25;7;30000;0;30;16;1;27;32;0;2;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;25;9;30000;0;15;32;1;18;32;0;-1;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;25;13;30000;0;15;32;1;3;32;0;-2;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;25;14;30000;0;20;8;1;22;32;-2;4;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;25;25;30000;0;12;32;1;22;32;1;4;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;25;26;30000;0;10;32;1;3;32;1;4;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;25;28;30000;0;15;32;1;3;32;-1;0;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;25;32;30000;0;30;16;1;1;32;-1;3;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;25;45;30000;0;1;32;1;24;32;-2;-1;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;26;4;30000;0;30;8;1;4;32;0;4;0;1;0;1;0;2;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;26;5;30000;0;30;32;1;17;32;0;3;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;26;7;30000;0;30;32;1;32;32;-1;2;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;26;9;30000;0;15;32;1;19;32;0;-2;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;26;13;30000;0;16;32;1;3;32;0;-1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;26;14;30000;0;15;32;1;2;32;0;-2;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;26;24;30000;0;12;32;1;29;32;-2;4;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;26;25;30000;0;9;8;1;12;32;1;4;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;26;26;30000;0;10;8;1;4;1;1;1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;26;28;30000;0;12;8;1;24;32;-2;-2;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;26;32;30000;0;15;32;1;2;32;-2;1;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;26;45;30000;0;4;8;1;1;32;1;-1;0;0;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;28;4;30000;0;32;8;1;11;32;-2;-1;0;0;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;28;5;30000;0;31;32;1;4;32;-2;3;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;28;7;30000;0;31;16;1;8;32;-2;2;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;28;9;30000;0;15;32;1;23;32;0;-1;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;28;13;30000;0;30;8;1;28;32;-1;-2;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;28;25;30000;0;10;8;1;8;32;0;-2;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;28;26;30000;0;12;8;1;22;32;-1;1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;28;28;30000;0;12;8;1;7;32;-2;1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;28;32;30000;0;15;32;1;6;32;-1;0;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;28;45;30000;0;1;32;1;10;32;-1;-2;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;29;14;30000;0;59;16;1;6;32;-1;4;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;29;29;30000;0;12;16;1;20;32;1;4;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;29;32;30000;0;20;8;1;1;32;-2;0;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;29;55;30000;0;60;8;1;30;32;-2;-2;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;32;4;30000;0;35;32;1;1;32;-1;1;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;32;5;30000;0;25;32;1;1;32;1;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;32;6;30000;0;25;32;1;1;32;-2;0;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;32;7;30000;0;27;32;1;1;32;-1;1;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;32;9;30000;0;25;32;1;1;32;1;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;32;13;30000;0;25;32;1;1;32;1;0;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;32;14;30000;0;15;32;1;6;32;0;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;32;17;30000;0;15;32;1;1;32;-2;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;32;20;30000;0;25;32;1;1;32;-2;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;32;22;30000;0;15;32;1;6;1;0;0;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;32;24;30000;0;15;32;1;1;32;-2;-2;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;32;25;30000;0;9;32;1;1;32;-1;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;32;26;30000;0;15;32;1;1;32;-1;1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;32;28;30000;0;15;32;1;1;32;-2;0;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;32;29;30000;0;15;32;1;1;32;1;0;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;32;32;30000;0;15;32;1;9;32;-1;-2;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;32;45;30000;0;15;32;1;1;32;-2;1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;32;55;30000;0;23;32;1;1;32;-1;0;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;45;4;30000;0;61;16;1;6;45;0;0;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;45;5;30000;0;28;16;1;25;45;1;-2;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;45;7;30000;0;27;32;1;24;45;0;3;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;45;9;30000;0;28;16;1;5;45;0;-1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;45;13;30000;0;30;32;1;3;45;0;0;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;45;25;30000;0;16;8;1;28;45;-2;-1;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;45;26;30000;0;50;8;1;27;45;0;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;45;28;30000;0;16;16;1;3;45;0;4;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;45;32;30000;0;17;16;1;1;45;1;-1;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;45;45;30000;0;1;16;1;17;45;-1;-1;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;55;29;30000;0;7;8;1;7;55;0;4;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;55;32;30000;0;5;16;1;11;55;-1;-2;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;32;55;55;30000;0;5;8;1;1;55;0;0;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;35;17;17;30000;0;18;35;1;27;35;-1;0;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;35;17;32;30000;0;8;8;1;26;1;-2;-2;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;35;32;35;30000;0;6;8;1;28;35;0;-2;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;35;35;32;30000;0;6;8;1;33;35;-1;-2;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;35;35;35;30000;0;7;8;1;9;1;0;4;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;36;36;36;30000;0;6;8;1;9;36;-1;5;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;40;40;40;30000;0;4;8;1;31;1;0;4;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;45;4;4;30000;0;19;8;1;2;45;-2;6;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;45;7;45;30000;0;1;8;1;2;45;1;0;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;45;9;45;30000;0;30;8;1;20;45;-2;6;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;45;13;13;30000;0;13;8;1;34;45;1;0;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;45;13;25;30000;0;7;8;1;25;45;-2;6;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;45;13;26;30000;0;8;8;1;18;45;0;6;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;45;13;28;30000;0;8;8;1;35;45;0;6;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;45;13;32;30000;0;6;8;1;9;45;1;6;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;45;13;45;30000;0;2;8;1;37;45;-2;-1;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;45;25;13;30000;0;16;8;1;25;45;1;-1;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;45;25;25;30000;0;16;8;1;13;45;-2;6;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;45;25;26;30000;0;16;45;1;24;45;-1;1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;45;25;28;30000;0;8;45;1;26;45;-1;-2;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;45;25;32;30000;0;16;45;1;24;45;-1;0;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;45;25;45;30000;0;3;8;1;45;45;-1;6;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;45;26;13;30000;0;27;8;1;9;45;1;6;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;45;26;25;30000;0;20;8;1;4;45;0;6;0;1;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;45;26;26;30000;0;16;45;1;2;45;-2;-2;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;45;26;28;30000;0;8;45;1;2;45;-2;1;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;45;26;32;30000;0;16;45;1;27;45;-1;0;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;45;26;45;30000;0;1;45;1;26;45;-1;-1;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;45;28;13;30000;0;11;24;1;18;45;1;5;0;1;0;1;0;1;1;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;45;28;25;30000;0;9;8;1;16;45;0;6;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;45;28;26;30000;0;16;45;1;35;45;-2;0;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;45;28;28;30000;0;16;45;1;2;45;1;0;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;45;28;32;30000;0;16;8;1;8;45;0;6;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;45;28;45;30000;0;6;45;1;1;45;1;6;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;45;32;13;30000;0;12;8;1;35;45;0;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;45;32;25;30000;0;16;8;1;3;45;0;6;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;45;32;26;30000;0;16;45;1;33;45;0;-1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;45;32;28;30000;0;5;16;1;12;45;0;3;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;45;32;32;30000;0;16;45;1;11;45;1;-2;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;45;32;45;30000;0;1;45;1;29;45;1;-1;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;45;45;7;30000;0;30;45;1;2;45;-2;-1;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;45;45;9;30000;0;30;45;1;27;45;0;1;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;45;45;13;30000;0;18;8;1;21;45;-2;6;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;45;45;25;30000;0;10;8;1;33;45;-2;6;0;1;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;45;45;26;30000;0;10;45;1;7;45;-2;-1;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;45;45;28;30000;0;30;45;1;2;45;0;-2;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;45;45;32;30000;0;30;45;1;12;45;-2;1;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;45;45;45;30000;0;1;45;1;18;45;-2;0;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;50;20;50;30000;0;3;50;1;32;50;-1;7;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;55;16;16;30000;0;30;8;1;1;55;-1;-2;0;0;0;1;0;2;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;55;16;29;30000;0;10;16;1;52;55;1;6;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;55;16;55;30000;0;3;16;1;38;55;0;5;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;55;29;16;30000;0;16;55;1;12;55;-1;-2;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;55;29;29;30000;0;16;55;1;9;55;-1;-2;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;55;29;32;30000;0;11;8;1;55;55;0;7;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;55;29;55;30000;0;2;16;1;16;55;-1;6;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;55;32;29;30000;0;16;55;1;17;55;-1;0;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;55;32;32;30000;0;3;55;1;2;55;0;4;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;55;32;55;30000;0;3;16;1;48;55;1;1;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;55;55;16;30000;0;15;55;1;13;55;-1;1;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;55;55;29;30000;0;30;55;1;7;55;-1;1;0;1;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;55;55;32;30000;0;1;55;1;30;55;0;0;0;0;0;1;0;0;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;55;55;55;30000;0;30;55;1;1;55;-2;1;0;0;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;64;64;64;30000;0;63;8;1;1;64;1;1;0;1;0;1;0;0;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;76;30;30;30000;0;10;16;1;50;76;1;7;0;0;0;1;0;2;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;76;30;76;30000;0;5;76;1;1;76;-1;9;0;1;0;1;0;2;0;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;76;76;30;30000;0;10;40;1;54;76;0;2;0;0;0;1;0;0;2;0;1 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;76;76;76;30000;0;6;16;1;1;76;-2;6;0;0;0;1;0;0;2;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;78;78;78;30000;0;4;8;1;26;78;1;-1;0;1;0;1;0;0;0;0;0 -Intel(R) Data Center GPU Max 1550 [0x0bd5];3;117;9;9;30000;0;20;8;1;95;117;-1;-1;0;0;0;1;0;0;0;0;1 diff --git a/src/acc/opencl/smm/params/tune_multiply_V100.csv b/src/acc/opencl/smm/params/tune_multiply_V100.csv deleted file mode 100644 index d319dd6b2b4..00000000000 --- a/src/acc/opencl/smm/params/tune_multiply_V100.csv +++ /dev/null @@ -1,158 +0,0 @@ -DEVICE;TYPEID;M;N;K;S;GFLOPS;BS;BM;BN;BK;WS;WG;LU;NZ;AL;TB;TC;AP;AA;AB;AC -Tesla V100-PCIE-16GB [0xb271];3;2;2;2;30000;35.1;12;1;1;2;0;-1;1;0;0;1;1;0;0;0;0;0 -Tesla V100-PCIE-16GB [0xb271];3;3;3;3;30000;93.7;12;3;1;3;0;-2;-1;0;0;0;1;0;0;0;0;0 -Tesla V100-PCIE-16GB [0xb271];3;4;4;4;30000;192.8;12;4;1;4;0;-2;0;0;0;0;1;0;1;0;0;0 -Tesla V100-PCIE-16GB [0xb271];3;4;4;5;30000;209.3;12;4;1;3;0;-2;0;0;0;1;1;0;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;4;4;7;30000;240.6;15;4;1;4;0;-1;-1;0;0;1;1;0;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;4;4;9;30000;254.8;8;4;1;2;0;-1;-1;0;0;0;1;0;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;4;4;10;30000;264.8;13;4;1;4;0;-2;0;0;0;0;1;0;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;4;4;13;30000;282.9;15;4;1;3;0;0;-1;0;0;1;1;0;1;0;0;0 -Tesla V100-PCIE-16GB [0xb271];3;4;4;15;30000;283.7;12;4;1;2;0;-2;-1;0;0;1;0;0;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;4;4;25;30000;310.8;25;4;1;4;0;0;-1;0;0;0;1;0;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;4;4;26;30000;308.3;4;4;1;2;0;-2;1;0;0;0;1;1;1;0;0;0 -Tesla V100-PCIE-16GB [0xb271];3;4;4;28;30000;316.8;25;4;1;4;0;0;0;0;0;0;1;0;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;4;4;32;30000;318.9;3;4;1;2;0;0;-2;0;0;0;1;1;1;0;0;0 -Tesla V100-PCIE-16GB [0xb271];3;4;5;4;30000;216.7;8;4;1;3;0;-1;0;0;0;0;1;0;0;0;0;0 -Tesla V100-PCIE-16GB [0xb271];3;4;5;5;30000;226.0;12;4;1;4;0;-1;0;0;0;0;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;4;5;7;30000;274.4;12;4;1;4;0;1;0;0;0;0;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;4;5;9;30000;302.3;12;4;1;4;0;-2;0;1;0;0;1;0;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;4;5;13;30000;337.3;15;4;1;2;0;0;0;0;0;0;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;4;5;25;30000;386.3;15;4;1;2;0;1;-1;0;0;0;1;1;1;0;0;0 -Tesla V100-PCIE-16GB [0xb271];3;4;7;4;30000;290.9;15;4;1;4;0;-1;-1;1;0;1;1;0;0;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;4;7;5;30000;311.1;12;4;1;3;0;-2;-1;0;0;1;1;1;1;0;0;0 -Tesla V100-PCIE-16GB [0xb271];3;4;7;7;30000;381.1;12;4;1;4;0;-2;-1;0;0;0;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;4;7;9;30000;423.7;12;4;1;3;0;-1;-1;0;0;0;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;4;7;13;30000;460.8;15;4;1;2;0;-2;0;0;0;1;1;1;1;0;0;0 -Tesla V100-PCIE-16GB [0xb271];3;4;9;4;30000;353.8;15;4;1;1;0;-2;-1;1;0;0;1;0;2;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;4;9;5;30000;387.9;12;4;1;4;0;-1;0;1;0;0;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;4;9;7;30000;481.5;12;4;1;2;0;1;-2;0;0;0;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;4;9;9;30000;531.4;12;4;1;4;0;-1;-1;0;0;0;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;4;9;13;30000;587.2;15;4;1;2;0;0;1;0;0;0;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;4;10;4;30000;394.9;15;4;1;2;0;0;-1;1;0;1;1;0;0;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;4;10;10;30000;593.4;13;4;1;2;0;1;1;0;0;1;1;1;1;0;0;0 -Tesla V100-PCIE-16GB [0xb271];3;4;13;4;30000;460.4;20;4;1;2;0;1;1;1;0;1;1;0;0;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;4;13;5;30000;491.0;12;4;1;4;0;-2;-1;0;0;0;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;4;13;7;30000;606.8;13;4;1;2;0;1;-1;0;0;0;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;4;13;9;30000;659.9;15;4;1;2;0;-2;-1;1;0;0;1;1;1;0;0;0 -Tesla V100-PCIE-16GB [0xb271];3;4;15;4;30000;484.4;24;4;1;4;0;-2;-1;0;0;1;1;1;0;0;0;0 -Tesla V100-PCIE-16GB [0xb271];3;4;25;4;30000;672.2;24;4;1;1;0;-2;0;1;0;1;1;0;2;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;4;25;5;30000;741.7;24;4;1;4;0;-1;-2;1;0;1;1;1;0;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;4;26;4;30000;692.1;20;4;1;2;0;-1;-1;1;0;1;1;0;0;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;4;28;4;30000;720.9;25;4;1;1;0;0;0;1;0;1;1;0;2;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;4;32;4;30000;760.2;24;4;1;4;0;0;-2;1;0;1;1;0;0;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;5;4;4;30000;242.9;12;5;1;2;0;0;0;0;0;0;1;0;0;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;5;4;5;30000;247.6;20;5;1;5;0;1;-1;0;0;0;1;0;2;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;5;4;7;30000;282.4;12;5;1;5;0;0;1;0;0;0;1;1;2;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;5;4;9;30000;303.9;12;5;1;4;0;-2;-1;0;0;1;1;0;0;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;5;4;13;30000;245.5;7;5;1;2;0;-2;1;1;0;0;1;1;1;0;0;0 -Tesla V100-PCIE-16GB [0xb271];3;5;4;25;30000;375.3;20;5;1;3;0;1;-1;1;0;0;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;5;5;4;30000;257.8;14;5;1;2;0;-1;0;0;0;0;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;5;5;5;30000;300.3;15;5;1;2;0;-1;-2;0;0;1;1;0;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;5;5;7;30000;338.9;20;5;1;3;0;-1;-2;0;0;0;1;0;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;5;5;9;30000;364.9;20;5;1;2;0;-1;1;0;0;1;1;0;1;0;0;0 -Tesla V100-PCIE-16GB [0xb271];3;5;5;13;30000;393.2;20;5;1;5;0;-1;-1;0;0;0;1;0;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;5;7;4;30000;314.7;12;5;1;2;0;-1;0;0;0;0;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;5;7;5;30000;360.8;12;5;1;4;0;1;-2;1;0;1;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;5;7;7;30000;435.2;12;5;1;2;0;-2;0;1;0;1;1;1;1;0;0;0 -Tesla V100-PCIE-16GB [0xb271];3;5;7;9;30000;479.6;13;5;1;3;0;1;-2;0;0;0;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;5;7;13;30000;523.5;12;5;1;5;0;-1;0;1;0;0;1;0;1;0;0;0 -Tesla V100-PCIE-16GB [0xb271];3;5;9;4;30000;386.9;12;5;1;3;0;-1;-1;1;0;0;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;5;9;5;30000;454.4;12;5;1;4;0;0;-2;1;0;0;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;5;9;7;30000;551.2;12;5;1;5;0;-2;0;0;0;1;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;5;9;9;30000;596.0;13;5;1;3;0;1;-2;0;0;0;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;5;13;4;30000;498.9;13;5;1;3;0;-1;0;1;0;0;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;5;13;5;30000;569.6;12;5;1;5;0;1;0;1;0;0;1;1;1;0;0;0 -Tesla V100-PCIE-16GB [0xb271];3;5;13;7;30000;699.9;13;5;1;4;0;-2;-2;1;0;1;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;5;13;13;30000;844.8;20;5;1;4;0;0;0;0;0;0;1;1;1;0;0;0 -Tesla V100-PCIE-16GB [0xb271];3;5;25;4;30000;593.2;11;5;1;5;0;0;0;0;0;0;1;1;0;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;7;5;5;30000;399.0;16;2;1;5;0;-1;-2;0;0;0;1;0;0;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;7;5;7;30000;438.8;20;2;1;3;0;0;-1;0;0;1;1;1;0;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;7;7;5;30000;506.3;15;1;2;6;0;-1;-2;1;0;1;1;0;2;0;0;0 -Tesla V100-PCIE-16GB [0xb271];3;7;7;7;30000;531.5;20;2;1;4;0;1;-2;1;0;1;1;0;0;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;7;7;13;30000;635.9;24;7;1;5;0;-1;0;0;0;0;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;7;13;13;30000;1037.5;20;7;1;5;0;0;-2;1;0;0;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;9;9;13;30000;905.3;25;9;1;7;0;0;0;0;0;0;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;9;13;9;30000;1027.6;20;9;1;2;0;0;0;0;0;0;1;1;1;0;0;0 -Tesla V100-PCIE-16GB [0xb271];3;9;13;13;30000;1136.0;20;9;1;8;0;1;-1;0;0;0;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;9;16;16;30000;1367.4;24;9;1;2;0;1;-1;1;0;0;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;9;22;16;30000;1569.6;24;9;1;6;0;-1;0;0;0;0;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;9;22;22;30000;1665.8;25;9;1;5;0;-2;-2;1;0;0;1;1;1;0;0;0 -Tesla V100-PCIE-16GB [0xb271];3;9;32;9;30000;1604.0;30;9;1;2;0;0;-1;1;0;0;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;9;32;22;30000;1944.9;50;9;1;4;0;0;1;1;0;0;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;9;32;32;30000;2154.3;50;9;1;3;0;0;0;0;0;0;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;13;5;5;30000;515.2;25;3;1;7;0;0;1;1;0;0;1;1;2;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;13;5;7;30000;547.3;13;3;1;8;0;0;1;0;0;1;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;13;5;13;30000;596.1;24;2;1;2;0;0;-2;1;0;0;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;13;7;5;30000;636.4;18;2;2;4;0;0;1;1;0;1;1;1;2;2;1;0 -Tesla V100-PCIE-16GB [0xb271];3;13;7;13;30000;811.2;12;13;1;12;0;0;0;0;0;0;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;13;9;9;30000;857.9;20;13;1;3;0;0;0;0;0;0;1;0;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;13;9;13;30000;885.8;25;13;1;2;0;1;0;0;0;0;1;1;1;0;0;0 -Tesla V100-PCIE-16GB [0xb271];3;13;13;5;30000;1009.6;24;13;1;8;0;1;0;1;0;0;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;13;13;7;30000;1189.4;25;13;1;10;0;1;-1;1;0;0;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;13;13;9;30000;1294.8;24;13;1;10;0;-1;-2;1;0;0;1;1;1;0;0;0 -Tesla V100-PCIE-16GB [0xb271];3;13;13;13;30000;1351.9;25;13;1;10;0;-1;0;0;0;0;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;16;9;16;30000;1054.4;12;16;1;4;0;-1;-2;1;0;1;1;1;0;0;0;0 -Tesla V100-PCIE-16GB [0xb271];3;16;9;22;30000;1094.0;25;16;1;5;0;0;-2;0;0;0;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;16;16;9;30000;1631.8;25;16;1;2;0;-1;-1;1;0;0;1;0;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;16;16;16;30000;1809.8;25;16;1;16;0;0;0;0;0;1;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;16;16;22;30000;1847.2;50;16;1;12;0;1;-2;1;0;1;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;16;22;9;30000;1783.9;25;16;1;6;0;-2;-1;1;0;1;1;0;1;0;0;0 -Tesla V100-PCIE-16GB [0xb271];3;16;22;16;30000;1999.5;40;16;1;16;0;-1;-2;0;0;1;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;16;22;22;30000;1934.5;25;16;1;14;0;0;0;0;0;0;1;0;1;2;1;0 -Tesla V100-PCIE-16GB [0xb271];3;20;20;20;30000;1986.9;40;20;1;13;0;1;-2;1;0;1;1;0;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;22;9;9;30000;809.5;20;22;1;17;0;-1;0;0;0;0;1;1;1;2;1;0 -Tesla V100-PCIE-16GB [0xb271];3;22;9;16;30000;1256.9;26;22;1;1;0;-2;-1;1;0;0;1;0;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;22;9;22;30000;1271.4;30;22;1;1;0;-2;1;0;0;0;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;22;9;32;30000;1371.7;24;22;1;1;0;0;-2;1;0;1;1;0;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;22;16;9;30000;1629.0;25;22;1;7;0;1;0;0;0;0;1;1;1;0;1;0 -Tesla V100-PCIE-16GB [0xb271];3;22;16;16;30000;2019.3;30;22;1;1;0;-2;0;0;0;0;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;22;16;22;30000;2279.6;50;22;1;9;0;0;0;1;0;1;1;1;1;1;0;0 -Tesla V100-PCIE-16GB [0xb271];3;22;22;9;30000;2034.8;50;22;1;6;0;1;1;1;0;0;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;22;22;16;30000;1982.0;40;22;1;15;0;-2;0;1;0;0;1;1;1;0;1;0 -Tesla V100-PCIE-16GB [0xb271];3;22;22;22;30000;2292.6;24;22;1;19;0;0;-2;1;0;0;1;1;1;0;0;0 -Tesla V100-PCIE-16GB [0xb271];3;22;22;32;30000;1891.9;14;22;1;14;0;-1;-1;0;0;1;1;0;1;2;1;0 -Tesla V100-PCIE-16GB [0xb271];3;22;32;9;30000;2402.7;40;22;1;13;0;1;0;1;0;0;1;1;1;0;0;0 -Tesla V100-PCIE-16GB [0xb271];3;22;32;22;30000;2739.0;50;22;1;15;0;-1;0;1;0;1;1;1;1;1;0;0 -Tesla V100-PCIE-16GB [0xb271];3;22;32;32;30000;3198.7;50;22;1;15;0;1;0;0;0;1;1;1;1;0;0;0 -Tesla V100-PCIE-16GB [0xb271];3;23;23;23;30000;2459.7;50;23;1;14;0;0;0;1;0;1;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;24;24;24;30000;2071.2;38;24;1;21;0;0;0;0;0;1;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;24;24;26;30000;2642.7;50;24;1;20;0;-1;0;1;0;0;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;24;24;32;30000;2244.6;50;24;1;17;0;-1;1;0;0;0;1;1;1;0;1;0 -Tesla V100-PCIE-16GB [0xb271];3;24;26;24;30000;2711.3;50;24;1;20;0;1;-2;0;0;1;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;24;26;26;30000;2121.7;48;24;1;2;0;1;-1;0;0;0;1;1;1;2;1;0 -Tesla V100-PCIE-16GB [0xb271];3;24;26;32;30000;2144.4;4;24;1;19;0;0;0;0;0;1;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;24;32;24;30000;2902.7;50;24;1;11;0;1;-1;1;0;0;1;0;1;2;1;0 -Tesla V100-PCIE-16GB [0xb271];3;24;32;26;30000;2408.9;25;24;1;16;0;0;-1;1;0;1;1;1;1;2;1;0 -Tesla V100-PCIE-16GB [0xb271];3;24;32;32;30000;3031.2;40;24;1;13;0;-1;-2;1;0;0;1;1;1;0;0;0 -Tesla V100-PCIE-16GB [0xb271];3;25;4;4;30000;291.1;24;25;1;3;0;1;0;0;0;1;1;1;1;0;0;0 -Tesla V100-PCIE-16GB [0xb271];3;25;4;5;30000;316.7;24;25;1;19;0;0;-2;0;0;0;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;25;5;4;30000;328.2;14;25;1;7;0;0;1;1;0;0;1;0;1;0;1;0 -Tesla V100-PCIE-16GB [0xb271];3;25;25;25;30000;2349.7;24;25;1;1;0;-1;-2;1;0;0;1;0;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;26;4;4;30000;306.9;1;26;1;26;0;-1;-1;1;0;1;1;1;2;0;0;0 -Tesla V100-PCIE-16GB [0xb271];3;26;24;24;30000;1976.0;21;26;1;26;0;-1;-1;0;0;1;1;1;1;2;1;0 -Tesla V100-PCIE-16GB [0xb271];3;26;24;26;30000;2405.2;50;26;1;26;0;1;0;0;0;1;1;0;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;26;24;32;30000;2449.8;50;26;1;23;0;1;-2;0;0;1;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;26;26;24;30000;2180.2;48;26;1;3;0;-2;0;0;0;0;1;1;1;0;1;0 -Tesla V100-PCIE-16GB [0xb271];3;26;26;26;30000;2978.2;50;26;1;19;0;0;-2;1;0;0;1;1;1;0;0;0 -Tesla V100-PCIE-16GB [0xb271];3;26;26;32;30000;2410.9;50;26;1;5;0;0;-2;0;0;1;1;0;1;0;1;0 -Tesla V100-PCIE-16GB [0xb271];3;26;32;24;30000;3304.4;50;26;1;15;0;1;-2;0;0;0;1;0;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;26;32;26;30000;2762.0;60;26;1;18;0;-1;-2;1;0;1;1;0;1;1;0;0 -Tesla V100-PCIE-16GB [0xb271];3;26;32;32;30000;2593.6;32;26;1;26;0;-1;0;0;0;1;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;28;4;4;30000;271.5;14;28;1;18;0;-1;-2;0;0;1;1;1;1;2;1;0 -Tesla V100-PCIE-16GB [0xb271];3;28;28;28;30000;2548.1;50;28;1;1;0;0;-2;1;0;0;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;30;30;30;30000;2542.6;32;30;1;30;0;-1;0;0;0;0;1;0;1;0;0;0 -Tesla V100-PCIE-16GB [0xb271];3;32;24;24;30000;2442.3;40;32;1;24;0;1;0;0;0;1;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;32;24;26;30000;2213.6;16;32;1;17;0;1;-2;0;0;1;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;32;24;32;30000;1755.0;1;32;1;12;0;0;0;0;0;0;1;0;1;1;0;0 -Tesla V100-PCIE-16GB [0xb271];3;32;26;24;30000;2360.4;32;32;1;32;0;1;0;0;0;1;1;0;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;32;26;26;30000;2579.2;40;32;1;31;0;-1;0;1;0;1;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;32;26;32;30000;2487.2;40;32;1;29;0;0;0;1;0;0;1;0;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;32;32;9;30000;2755.0;50;32;1;22;0;1;-2;0;0;0;1;0;1;0;0;0 -Tesla V100-PCIE-16GB [0xb271];3;32;32;22;30000;2680.6;32;32;1;31;0;-1;0;1;0;1;1;1;1;0;0;0 -Tesla V100-PCIE-16GB [0xb271];3;32;32;24;30000;2742.6;54;32;1;22;0;0;-2;1;0;1;1;1;1;1;0;0 -Tesla V100-PCIE-16GB [0xb271];3;32;32;26;30000;3464.2;50;32;1;27;0;-1;0;0;0;1;1;0;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;32;32;32;30000;3267.1;50;32;1;31;0;1;-2;1;0;0;1;1;1;2;0;0 -Tesla V100-PCIE-16GB [0xb271];3;35;35;35;30000;2236.7;9;35;1;25;0;0;-2;0;0;1;1;1;1;0;0;0 -Tesla V100-PCIE-16GB [0xb271];3;36;36;36;30000;2138.9;71;36;1;1;0;1;-2;1;0;0;1;0;1;0;0;0 -Tesla V100-PCIE-16GB [0xb271];3;40;40;40;30000;2291.0;9;40;1;1;0;0;0;1;0;0;1;1;1;1;0;0 -Tesla V100-PCIE-16GB [0xb271];3;45;45;45;30000;2754.3;50;45;1;29;0;0;0;1;0;0;1;1;1;2;0;0 diff --git a/src/acc/opencl/smm/requirements.txt b/src/acc/opencl/smm/requirements.txt deleted file mode 100644 index 9767bc7d699..00000000000 --- a/src/acc/opencl/smm/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -wheel -opentuner diff --git a/src/acc/opencl/smm/tune_multiply.py b/src/acc/opencl/smm/tune_multiply.py deleted file mode 100755 index 002aadafd5c..00000000000 --- a/src/acc/opencl/smm/tune_multiply.py +++ /dev/null @@ -1,979 +0,0 @@ -#!/usr/bin/env python3 -#################################################################################################### -# Copyright (C) by the DBCSR developers group - All rights reserved # -# This file is part of the DBCSR library. # -# # -# For information on the license, see the LICENSE file. # -# For further information please visit https://dbcsr.cp2k.org # -# SPDX-License-Identifier: BSD-3-Clause # -#################################################################################################### -import opentuner -from opentuner.search.manipulator import IntegerParameter -from opentuner.tuningrunmain import TuningRunMain -from opentuner import ConfigurationManipulator -from opentuner import MeasurementInterface -from opentuner import Result -from signal import signal, SIGINT -import tempfile -import copy -import json -import glob -import math -import sys -import re -import os - -default_enable_tune = {"tune", "enabled", "on"} -default_basename = "tune_multiply" -default_mnk = "23x23x23" -default_dbg = False -default_retry = 1 -default_vlen = 8 - -type_dp = 3 -type_sp = 1 - - -def start(args): - """Construct and start tuner instance""" - instance = SmmTuner(args) - if not default_dbg: - for retry in range(default_retry): - try: - TuningRunMain(instance, args).main() - return - except Exception as e: - ign = ( - "[{}/{}]".format(retry + 1, default_retry) - if 1 < default_retry - else "" - ) - print("IGNORED{} {}: {}".format(ign, type(e).__name__, e)) - pass - instance.save_final_config(None, True) - else: - TuningRunMain(instance, args).main() - - -def env_intvalue(env, default, lookup=True): - value = os.getenv(env, default) if lookup else env if env is not None else default - try: - return int(value) - except ValueError: - return int(default) - - -def ilog2(n): - i, t = (0 if 1 != n else 1), 1 - while t < n: - t <<= 1 - i += 1 - return i - - -class SmmTuner(MeasurementInterface): - def __init__(self, args): - """Setup common state and define search space""" - super(SmmTuner, self).__init__(args) - mnk = tuple(max(int(i), 1) for i in self.args.mnk.split("x")) - self.mnk = (mnk + (mnk[0], mnk[0]))[:3] - self.wsx = self.mnk[0] * self.mnk[1] - self.manip = ConfigurationManipulator() - # sanitize input arguments - self.args.mb = max(self.args.mb, 1) - self.args.bs = max(min(self.args.bs, self.args.mb), 1) - self.args.bm = [max(self.args.bm, 1), self.mnk[0]][0 == self.args.bm] - self.args.bn = [max(self.args.bn, 1), 1][0 == self.args.bn] - self.args.bk = [max(self.args.bk, 1), self.mnk[2]][0 == self.args.bk] - self.args.ws = min(self.args.ws, self.wsx) - self.gfbase = self.gfsave = self.gflops = self.gflogs = self.gfscnt = 0 - self.config = self.typename = self.typeid = self.device = self.size = None - self.bs = self.bm = self.bn = self.bk = self.ws = self.wg = self.lu = None - self.nz = self.al = self.tb = self.tc = None - self.ap = self.aa = self.ab = self.ac = None - self.idevice, self.ndevices = None, 0 - self.exepath = os.path.join( - os.path.dirname(sys.argv[0]), "..", "..", "acc_bench" - ) - runcmd = self.launch(["ACC_OPENCL_VERBOSE=2"], 0, nrep=1) - self.run_result = ( # verbosity to capture device name and tuned parameters - self.call_program(" ".join(runcmd)) - if ( # consider validating parameters during merge - (self.args.merge is None or 0 > self.args.merge) - or (self.args.check is None or 0 != self.args.check) - ) - and (self.args.update is None or "" == self.args.update) - else None - ) - if self.run_result: - stdout = str(self.run_result["stdout"]) - if 0 >= self.args.size: - sizepat = "(\\w+)\\s+[0-9]+\\s+([0-9]+)" - size = re.search(sizepat, stdout) - self.size = int(size.group(2)) if size and size.group(2) else 0 - else: - self.size = self.args.size - typename = re.search("typename \\(id=([0-9]+)\\):\\s+(\\w+)", stdout) - self.typename = typename.group(2) if typename and typename.group(2) else "" - self.typeid = ( - int(typename.group(1)) if typename and typename.group(1) else 0 - ) - devicepat = ( - 'INFO ACC/OpenCL:\\s+ndevices=([0-9]+)\\s+device[0-9]+="([^"]+)"' - ) - device = re.search(devicepat, str(self.run_result["stderr"])) - self.ndevices = int(device.group(1)) if device and device.group(1) else 0 - self.device = device.group(2) if device and device.group(2) else "" - # idevice: make certain resources/names unique on a per-rank basis - envrank_mpich = os.getenv("PMI_RANK") # global - envrank_ompi = os.getenv("OMPI_COMM_WORLD_LOCAL_RANK", envrank_mpich) - envrank = os.getenv("MPI_LOCALRANKID", envrank_ompi) - if envrank: - self.idevice = int(envrank) % self.ndevices - elif self.args.update is not None and "" != self.args.update: - self.device = self.args.update - if self.run_result and 0 == self.run_result["returncode"]: - seedpat = "INFO ACC/LIBSMM:\\s+SMM-kernel\\s+{}={}\\s+gen=".format( - "{t,m,n,k, bs,bm,bn,bk, ws,wg, lu,nz,al, tb,tc, ap,aa,ab,ac}", - "{{{}, {}}}".format( # key and value - "{},{}".format( # t,m,n,k (key) - self.typeid, ",".join(map(str, self.mnk)) - ), - "{}, {}, {}, {}, {}".format( # value: if neg. "-*[0-9]+" - "(-*[0-9]+),(-*[0-9]+),(-*[0-9]+),(-*[0-9]+)", # bs,bm,bn,bk - "(-*[0-9]+),(-*[0-9]+)", # ws,wg - "(-*[0-9]+),(-*[0-9]+),(-*[0-9]+)", # lu,nz,al - "(-*[0-9]+),(-*[0-9]+)", # tb,tc - "(-*[0-9]+),(-*[0-9]+),(-*[0-9]+),(-*[0-9]+)(, .+)*", # ap,aa,ab,ac[, ext] - ), - ), - ) - seed = re.search(seedpat, str(self.run_result["stderr"])) - nprm = len(seed.groups()) if seed else 0 - if 15 > nprm: - print("WARNING: missed to parse initial parameters!") - maxlu = (self.mnk[0] + default_vlen - 1) / default_vlen - # setup fixed and tunable parameters - params, paramt = [], [] - self.create_param("BS", params, paramt, seed, 1, 1, self.args.mb) - self.create_param("BM", params, paramt, seed, 2, 1, self.mnk[0]) - self.create_param("BN", params, paramt, seed, 3, 1, self.mnk[1]) - self.create_param("BK", params, paramt, seed, 4, 1, self.mnk[0]) - self.create_param("WS", params, paramt, seed, 5, 1, self.wsx) - self.create_param("WG", params, paramt, seed, 6, -2, 1, False) # avoid WG=2 - self.create_param("LU", params, paramt, seed, 7, -2, maxlu) - self.create_param("NZ", params, paramt, seed, 8, 0, 1) - self.create_param("AL", params, paramt, seed, 9, 0, 1) - self.create_param("TB", params, paramt, seed, 10, 0, 1) - self.create_param("TC", params, paramt, seed, 11, 0, 1) - self.create_param("AP", params, paramt, seed, 12, 0, 1) - self.create_param("AA", params, paramt, seed, 13, 0, 2) - self.create_param("AB", params, paramt, seed, 14, 0, 2) - self.create_param("AC", params, paramt, seed, 15, 0, 1) - if 15 < nprm and seed.group(16) and 2 < len(seed.group(16)): - self.create_param("XF", params, paramt, seed.group(16)[2:], -1, 0, 1) - else: - self.create_param("XF", params, paramt, 0, -1, 0, 1) - if not paramt: - sys.tracebacklimit = 0 - raise RuntimeError( - "All parameters are fixed with environment variables!" - ) - for param in params + paramt: - self.manip.add_parameter(param) - if ( - ( # consider to update and/or merge JSONS (update first) - self.args.merge is not None - and (0 <= self.args.merge or self.typeid) - and ( - (self.args.check is not None and 0 == self.args.check) - or (self.run_result and 0 == self.run_result["returncode"]) - ) - ) - or (self.args.check is None or 0 != self.args.check) - or (self.args.update is None or "" != self.args.update) - ): - filepattern = "{}-*.json".format(default_basename) - filedot = "." + filepattern - filenames = glob.glob( - os.path.normpath(os.path.join(self.args.jsondir, filedot)) - ) - for filename in filenames: - self.rename_dotfile(filename) - filenames = glob.glob( - os.path.normpath(os.path.join(self.args.jsondir, filepattern)) - ) - if self.args.update is None or "" != self.args.update: - self.update_jsons(filenames) - elif self.args.check is None or 0 != self.args.check: - self.update_jsons(filenames) - if 0 < self.gfscnt and self.args.check and 0 > self.args.check: - gmn = math.exp(self.gflogs / self.gfscnt) - print("Geometric mean of {} GFLOPS/s".format(round(gmn))) - elif self.args.merge is not None: - self.merge_jsons(filenames) - exit(0) - elif ( - (self.typename and "" != self.typename) - and (self.device and "" != self.device) - and (self.typeid and 0 < self.ndevices) - and (self.size and 0 < self.size) - ): # setup database (DB) - if self.args.database is None: # adjust DB-location - tmpdir = os.path.join(tempfile.gettempdir(), "opentuner") - if self.idevice is not None: - tmpdir += str(self.idevice) - try: - os.mkdir(tmpdir) - except: # noqa: E722 - pass - self.args.database = "sqlite:///" + os.path.join( - tmpdir, "{}.db".format(os.getpid()) - ) - if not self.args.label: # label for DB-session - self.args.label = "{}-{}-{}-s{}".format( - default_basename, - self.typename, - "x".join(map(str, self.mnk)), - ilog2(self.size), - ) - else: - sys.tracebacklimit = 0 - raise RuntimeError("Setup failed for {}!".format(self.exepath)) - # register signal handler (CTRL-C) - signal(SIGINT, self.handle_sigint) - self.handle_sigint_counter = 0 - - def manipulator(self): - return self.manip - - def create_param( - self, name, params, paramt, match, match_id, value0, value1, expand=True - ): - """Append integer-parameter to either params or paramt list""" - value_key = "OPENCL_LIBSMM_SMM_{}".format(name) - value_env = os.getenv(value_key) - attribute = getattr(self, name.lower(), None) - tunable = value_env in default_enable_tune - if 0 <= match_id: - if match and match.group(match_id): - value = int(match.group(match_id)) - else: - value = 0 if value_env is None else int(value_env) - if not tunable: - tunable = value_env is None - else: - if attribute is None: - value = getattr(self.args, name.lower(), None) - if value is None: - value = int(value_env if match is None else match) - else: - value = int(attribute) - if not tunable: - tunable = value_env is None and 0 != value - if tunable: # consider expanding value range according to seed - v0 = min(value0, value) if expand else value0 - v1 = max(value1, value) if expand else value1 - paramt.append(IntegerParameter(name, v0, v1)) - else: # fixed parameter - params.append(IntegerParameter(name, value, value)) - if attribute is None: - setattr(self, name.lower(), value) - - def launch(self, envs, check=None, nrep=None, verbose=None): - """Launch executable supplying environment and arguments""" - envlist = envs if isinstance(envs, list) else self.environment(envs) - mnk = (envs["M"], envs["N"], envs["K"]) if "M" in envs else self.mnk - env_exe = " ".join(map(str, envlist)) - if verbose is not None and 0 != int(verbose): - msg = env_exe.replace("OPENCL_LIBSMM_SMM_", "") - print("{}: {}".format("x".join(map(str, mnk)), msg)) - env_std = "OMP_PROC_BIND=TRUE OPENCL_LIBSMM_SMM_S=0" - env_jit = "NEO_CACHE_PERSISTENT=0 CUDA_CACHE_DISABLE=1" - env_check = "CHECK={}".format(check if check is not None else 1) - env_intrn = "{} {}".format( # consider device-id - "" if self.idevice is None else "ACC_OPENCL_DEVICE={}".format(self.idevice), - "{} {} {}".format(env_std, env_jit, env_check), # environment - ).strip() - arg_exe = "{} {} {}".format( - self.args.r if nrep is None else nrep, - self.size if self.size else self.args.size, - " ".join(map(str, mnk)), - ).strip() - return [env_exe, env_intrn, self.exepath, arg_exe] - - def seed_configurations(self): - return [ - { - "BS": self.bs if self.bs is not None else self.args.bs, - "BM": self.bm if self.bm is not None else self.args.bm, - "BN": self.bn if self.bn is not None else self.args.bn, - "BK": self.bk if self.bk is not None else self.args.bk, - "WS": self.ws if self.ws is not None else self.args.ws, - "WG": self.wg if self.wg is not None else self.args.wg, - "NZ": self.nz if self.nz is not None else self.args.nz, - "LU": self.lu if self.lu is not None else self.args.lu, - "AL": self.al if self.al is not None else self.args.al, - "TB": self.tb if self.tb is not None else self.args.tb, - "TC": self.tc if self.tc is not None else self.args.tc, - "AP": self.ap if self.ap is not None else self.args.ap, - "AA": self.aa if self.aa is not None else self.args.aa, - "AB": self.ab if self.ab is not None else self.args.ab, - "AC": self.ac if self.ac is not None else self.args.ac, - "XF": self.xf if self.xf is not None else 0, - } - ] - - def objective(self): - if 0 == self.args.tlevel: - return opentuner.search.objective.MaximizeAccuracyMinimizeSize() - else: - return opentuner.search.objective.MaximizeAccuracy() - - def environment(self, config): - return [ - "OPENCL_LIBSMM_SMM_{}={}".format(key, config[key]) - for key in sorted(config.keys()) - if 2 == len(key) - ] - - def run(self, desired_result, input=None, limit=None, message=None, nrep=None): - """Run a configuration and return performance""" - try: - config = desired_result.configuration.data - mnk = self.mnk - except AttributeError: - config = desired_result - mnk = (config["M"], config["N"], config["K"]) - skip = False - if self.args.quick: - if 1 == config["AA"] or 1 == config["AB"]: - skip = True - performance = None - if not skip: - runcmd = self.launch(config, self.args.check, nrep, self.args.verbose) - self.run_result = self.call_program(" ".join(runcmd)) - result = self.run_result["returncode"] if self.run_result else 1 - if 0 == result: - performance = re.search( - "device:\\s+([0-9]+[^ ]*) ms\\s+([0-9]+[^ ]*)", - str(self.run_result["stdout"]), - ) - if performance and performance.group(1) and performance.group(2): - mseconds, gflops = float(performance.group(1)), float(performance.group(2)) - if 0 < gflops: - self.gflogs = self.gflogs + math.log(gflops) - self.gfscnt = self.gfscnt + 1 - if config is not desired_result: - kernelreq = round((100.0 * config["BM"] * config["BN"]) / self.wsx) - # gflops are reported as "accuracy" (console output) - result = Result(time=mseconds, accuracy=gflops, size=kernelreq) - if self.gflops < gflops: # keep best config in case of early exit - self.config = desired_result.configuration - self.gflops = gflops - if 0 != self.gfbase: - self.save_final_config(self.config, final=False) - else: # seed configuration - self.gfbase = gflops - elif not self.args.verbose: - if message: - status = "OK" - if 1 != int(nrep): - gfbase = config["GFLOPS"] if "GFLOPS" in config else 0 - if 0 < gfbase: - status = "{}x - ".format(round(gflops / gfbase, 2)) - status = status + "{} GFLOPS/s".format(round(gflops)) - print("{} - {}".format(message, status), flush=True) - else: - print(".", end="", flush=True) - elif not skip: # return non-competitive/bad result in case of an error - failed = runcmd[0].replace("OPENCL_LIBSMM_SMM_", "") - if message: - msg = "{} - FAILED".format(message) - else: - msg = "FAILED[{}] {}: {}".format( - result, "x".join(map(str, mnk)), failed - ) - if config is not desired_result: - result = Result(time=float("inf"), accuracy=0.0, size=100.0) - elif not self.args.verbose and not message: - print("") - print(msg, flush=True) - else: - result = Result(time=float("inf"), accuracy=0.0, size=100.0) - return result - - def update_jsons(self, filenames): - """Update device name or verify all JSONs""" - if self.device: - n = len(filenames) - for i, filename in enumerate(filenames): - try: - with open(filename, "r") as file: - data = json.load(file) - if self.args.check is None or 0 != self.args.check: - progress, r = "[{}/{}]: {}".format(i + 1, n, filename), 1 - if self.args.check is not None: - r = max(self.args.check, 0) - if "TYPEID" in data and self.typeid == data["TYPEID"]: - self.run(data, message=progress, nrep=r) - elif "DEVICE" in data and data["DEVICE"] != self.device: - print("Updated {} to {}.".format(filename, self.device)) - data.update({"DEVICE": self.device}) - file.close() - with open(filename, "w") as file: - json.dump(data, file, sort_keys=True) - file.write("\n") - except (json.JSONDecodeError, KeyError): - print("Failed to update {}.".format(filename)) - else: - print("Cannot determine device name.") - - def make_csv_record(self, data, filename): - """Make key-value tuples from JSON-data""" - device = data["DEVICE"] if "DEVICE" in data else self.device - value = ( - data["S"] if "S" in data else 0, # pseudo key component - data["GFLOPS"] if "GFLOPS" in data else 0, - data["BS"], - data["BM"], - data["BN"], - data["BK"] if "BK" in data else 0, - data["WS"] if "WS" in data else 0, - data["WG"] if "WG" in data else 0, - data["LU"] if "LU" in data else 0, - data["NZ"] if "NZ" in data else 0, - data["AL"] if "AL" in data else 0, - data["TB"] if "TB" in data else 0, - data["TC"] if "TC" in data else 1, - data["AP"] if "AP" in data else 0, - data["AA"] if "AA" in data else 0, - data["AB"] if "AB" in data else 0, - data["AC"] if "AC" in data else 0, - data["XF"] if "XF" in data else 0, - filename, # last entry - ) - return (device, data["TYPEID"], data["M"], data["N"], data["K"]), value - - def merge_jsons(self, filenames): - """Merge all JSONs into a single CSV-file""" - if not self.args.csvfile or (self.idevice is not None and 0 != self.idevice): - return # early exit - merged, retain, delete = dict(), dict(), [] - self.gflogs = self.gfscnt = skipcnt = 0 - for filename in filenames: - try: - with open(filename, "r") as file: - data = json.load(file) - if not data or ( - self.args.merge is not None - and ( - (0 > self.args.merge and self.typeid != data["TYPEID"]) - or (1 == self.args.merge and type_sp != data["TYPEID"]) - or (2 == self.args.merge and type_dp != data["TYPEID"]) - ) - ): # skip parameter set (JSON-file) - skipcnt = skipcnt + 1 - continue - key, value = self.make_csv_record(data, filename) - except (json.JSONDecodeError, KeyError, TypeError): - print("Failed to merge {} into CSV-file.".format(filename)) - continue - except: # noqa: E722 - continue - pass - if bool(data) and key in merged: - gfbase, mname = merged[key][1], merged[key][-1] - gflops, mtime = value[1], os.path.getmtime(mname) - if gfbase < gflops: # merged data is worse - if mtime < os.path.getmtime(filename): # older - delete.append(mname) - else: - if key in retain: - if retain[key][1] < gflops: - delete.append(retain[key][-1]) - retain[key] = merged[key] - else: # merged data is leading - if mtime < os.path.getmtime(filename): # older - if key in retain: - if retain[key][1] < gflops: - delete.append(retain[key][-1]) - retain[key] = value - else: - delete.append(filename) - else: - retain[key] = value - else: # newer - delete.append(filename) - data = dict() # ensure data is not merged - if bool(data) and ( # consider to finally validate result - (self.args.check is not None and 0 == self.args.check) - or 0 == self.run(data, nrep=1) - ): - merged[key] = value - # replace older/best with latest/best (forced refresh) - if self.args.delete and 3 <= self.args.delete: - for key, value in retain.items(): - if key in merged: - rname, mname = value[-1], merged[key][-1] - if os.path.getmtime(mname) < os.path.getmtime(rname): - retain[key] = merged[key] - merged[key] = value - # print/delete outperformed results - if self.args.delete and 2 <= self.args.delete: - rfiles = [v[-1] for v in retain.values()] - delete = delete + rfiles - if bool(delete): - num, lst, msg = len(delete), " ".join(delete), "Remove" - if self.args.delete and 3 != self.args.delete: - for filename in delete: - try: - os.remove(filename) - except: # noqa: E722 - pass - msg = "Removed" - skipcnt = skipcnt + num - print("{} {}: {}".format(msg, num, lst)) - print("") - # write CSV-file and collect overall-statistics - if bool(merged): - with open(self.args.csvfile, "w") as csvfile: - csvfile.write( # CSV header line with termination/newline - "{}{}{}{}{}{}{}{}{}\n".format( # key-part - self.args.csvsep.join(["DEVICE", "TYPEID", "M", "N", "K"]), - self.args.csvsep, # separator for value-part - "S", # pseudo-key component - self.args.csvsep, - self.args.csvsep.join(["GFLOPS", "BS", "BM", "BN", "BK"]), - self.args.csvsep, - self.args.csvsep.join(["WS", "WG", "LU", "NZ", "AL"]), - self.args.csvsep, - self.args.csvsep.join(["TB", "TC", "AP", "AA", "AB", "AC"]), - ) - ) - types = [key[1] for key in merged.keys()] - pure = min(types) == max(types) - for key, value in sorted(merged.items()): # CSV data lines (records) - # FLOPS are normalized for double-precision (ratio of 1:2 assumed) - gflops = value[1] if pure or type_sp != key[1] else value[1] * 0.5 - values = list(value[:-1]) - if self.args.nogflops: - values[1] = 0 # zero instead of gflops written into CSV-file - if 0 < gflops: - self.gflogs = self.gflogs + math.log(gflops) - self.gfscnt = self.gfscnt + 1 - strkey = self.args.csvsep.join([str(k) for k in key]) - strval = self.args.csvsep.join([str(v) for v in values]) - csvfile.write("{}{}{}\n".format(strkey, self.args.csvsep, strval)) - # print summary information - msg = "Merged {} of {} JSONs into {}".format( - len(merged), len(filenames) - skipcnt, self.args.csvfile - ) - if 0 < self.gfscnt: - gmn = math.exp(self.gflogs / self.gfscnt) - msg = "{} (geometric mean of {} GFLOPS/s)".format(msg, round(gmn)) - if not self.args.verbose and (self.args.check is None or 0 != self.args.check): - print("") - print(msg) - - def rename_dotfile(self, dotfile): - try: - data = None - with open(dotfile, "r") as file: - data = json.load(file) - gflops = data["GFLOPS"] if data and "GFLOPS" in data else 0 - if 0 < gflops: - filemain = "-".join(os.path.basename(dotfile).split("-")[1:4]) - filename = "{}-{}-{}gflops.json".format( - default_basename, filemain, round(gflops) - ) - os.rename(dotfile, os.path.join(self.args.jsondir, filename)) - except: # noqa: E722 - pass - - def save_final_config(self, configuration, final=True): - """Called at termination""" - if not final and (0 >= self.gflops or not configuration): - return # nothing to save - config = configuration.data if configuration else None - cfgenv = self.environment(config) if config else None - envchk = os.getenv("CHECK") # force CHECKing result unless CHECK=0 - result = self.run_result["returncode"] if config and self.run_result else 1 - if 0 == result and 0 == self.args.check and (envchk is None or "0" != envchk): - self.run_result = self.call_program(" ".join(self.launch(cfgenv, 1))) - result = self.run_result["returncode"] if self.run_result else 1 - # extend result for easier reuse - if config: - config["DEVICE"] = self.device - config["GFLOPS"] = self.gflops - config["TYPEID"] = self.typeid - config["M"] = self.mnk[0] - config["N"] = self.mnk[1] - config["K"] = self.mnk[2] - config["S"] = self.size - filedev = "" if self.idevice is None else "-{}".format(self.idevice) - filedot = os.path.join( - self.args.jsondir, ".{}{}.json".format(self.args.label, filedev) - ) - if config and self.gfsave < self.gflops: # save intermediate result - if 0 == self.gfsave and os.path.exists(filedot): # backup - self.rename_dotfile(filedot) - # self.manipulator().save_to_file(config, filename) - with open(filedot, "w") as file: - cfg = config - if "XF" in config and 0 == config["XF"]: - cfg = copy.deepcopy(config) - del cfg["XF"] - json.dump(cfg, file, sort_keys=True) - file.write("\n") # append newline at EOF - self.gfsave = self.gflops - # check return code (consider not saving parameters) - if 0 != result and not final: # incorrect result - failed = " ".join(map(str, cfgenv)).replace("OPENCL_LIBSMM_SMM_", "") - mnk = "x".join(map(str, self.mnk)) - print("FAILED[{}] {}: {}".format(result, mnk, failed), flush=True) - return - if final and 0 < self.gflops and os.path.exists(filedot): - filepattern = "{}-*.json".format(default_basename) - filenames = glob.glob( - os.path.normpath(os.path.join(self.args.jsondir, filepattern)) - ) - if not filenames and glob.glob(self.args.csvfile): - msg = "WARNING: no JSON-file found but {} will be overwritten." - print(msg.format(self.args.csvfile)) - fileonly = "{}-{}gflops.json".format(self.args.label, round(self.gflops)) - filename = os.path.normpath(os.path.join(self.args.jsondir, fileonly)) - try: - os.rename(filedot, filename) - except: # noqa: E722 - pass - if filename not in filenames: # rebuild CSV-file - filenames.append(filename) - self.merge_jsons(filenames) - speedup = round((self.gflops / self.gfbase) if 0 < self.gfbase else 0, 1) - msg = " ({}x over seed)".format(speedup) if 1 < speedup else "" - print("Result{} was written to {}".format(msg, filename)) - elif final and self.args.merge is None: - print("WARNING: no tuned results produced!") - - def handle_sigint(self, signum, frame): - """Handle SIGINT or CTRL-C""" - if 1 > self.handle_sigint_counter: # avoid recursion - self.handle_sigint_counter = self.handle_sigint_counter + 1 - msg = "\nWARNING: tuning {}-kernel interrupted." - print(msg.format("x".join(map(str, self.mnk)))) - try: - self.save_final_config(self.config, True) - except: # noqa: E722 - pass - exit(1) - - -if __name__ == "__main__": - argparser = opentuner.default_argparser() - # adjust default value of existing arguments - argparser.set_defaults(no_dups=True) - # add primary arguments (parsed first) - argparser.add_argument( - "mnk", - type=str, - default=default_mnk, - nargs="?", - help="Shape of SMM-kernel (MxNxK)", - ) - argparser.add_argument( - "-r", - "--repetitions", - type=int, - default=0, - nargs="?", - dest="r", - help="Repetitions per experiment", - ) - argparser.add_argument( - "-e", - "--csv-separator", - type=(lambda c: c if isinstance(c, str) and 1 == len(c) else False), - default=";", - nargs="?", - dest="csvsep", - help="Separator used in CSV-file", - ) - argparser.add_argument( - "-o", - "--csv-filename", - type=str, - default="{}.csv".format(default_basename), - nargs="?", - dest="csvfile", - help="Generate CSV-file", - ) - argparser.add_argument( - "-m", - "--csv-merge-jsons", - type=int, - default=None, - const=-1, - nargs="?", - dest="merge", - help="Merge JSONs into CSV (-1: auto, 0: all, 1: SP, 2: DP, 3: hidden)", - ) - argparser.add_argument( - "-x", - "--csv-nogflops", - action="store_true", - default=False, - dest="nogflops", - help="Exclude real GFLOPS", - ) - argparser.add_argument( - "-p", - "--jsons-dir", - type=str, - default=".", - nargs="?", - dest="jsondir", - help="Directory to read/write JSONs", - ) - argparser.add_argument( - "-u", - "--jsons-update", - type=str, - default="", - nargs="?", - dest="update", - help="Update JSONs (device name optional)", - ) - argparser.add_argument( - "-c", - "--check", - type=float, - default=0, - nargs="?", - help="Validate kernel (none:verify, epsilon - 0:off, -1:verify perf.)", - ) - argparser.add_argument( - "-d", - "--delete", - type=int, - default=None, - const=1, - nargs="?", - help="Remove JSONs (1:worse/old, 2:worse/new, 3:dry, 4:prefer/new)", - ) - argparser.add_argument( - "-v", - "--verbose", - action="store_true", - default=False, - help="Verbose output", - ) - argparser.add_argument( - "-a", - "--tuning-level", - type=int, - default=-1, - nargs="?", - dest="tlevel", - help="Tunables: (0) all, (1) most, (2) some, (3) least", - ) - argparser.add_argument( - "-q", - "--quick", - action="store_true", - default=False, - help="Omit certain configurations", - ) - argparser.add_argument( - "-bm", - "--initial-bm", - type=int, - default=env_intvalue("OPENCL_LIBSMM_SMM_BM", "0"), - nargs="?", - dest="bm", - help="Block/tile size (0:auto)", - ) - argparser.add_argument( - "-bn", - "--initial-bn", - type=int, - default=env_intvalue("OPENCL_LIBSMM_SMM_BN", "0"), - nargs="?", - dest="bn", - help="Block/tile size (0:auto)", - ) - argparser.add_argument( - "-bk", - "--initial-bk", - type=int, - default=env_intvalue("OPENCL_LIBSMM_SMM_BK", "0"), - nargs="?", - dest="bk", - help="Block size (0:auto)", - ) - argparser.add_argument( - "-ws", - "--initial-ws", - type=int, - default=env_intvalue("OPENCL_LIBSMM_SMM_WS", "0"), - nargs="?", - dest="ws", - help="Minimum WG-size (0:auto)", - ) - argparser.add_argument( - "-wg", - "--initial-wg", - type=int, - default=env_intvalue("OPENCL_LIBSMM_SMM_WG", "0"), - dest="wg", - help="Size of WG: subgroups (-1), tight (0), round-up (1), PoT (2)", - ) - argparser.add_argument( - "-lu", - "--initial-lu", - type=int, - default=env_intvalue("OPENCL_LIBSMM_SMM_LU", "-1"), - dest="lu", - help="Loop unroll (-2) full, (-1) no hints (default)," - + " (0) inner, (1) outer-dehint, (2) block-m", - ) - argparser.add_argument( - "-nz", - "--initial-nz", - type=int, - default=env_intvalue("OPENCL_LIBSMM_SMM_NZ", "0"), - dest="nz", - help="Check (1) atomic increment to be non-zero (0:off)", - ) - argparser.add_argument( - "-al", - "--initial-al", - type=int, - default=env_intvalue("OPENCL_LIBSMM_SMM_AL", "0"), - dest="al", - help="Access: transposed (0), linear (1)", - ) - argparser.add_argument( - "-tb", - "--initial-tb", - type=int, - default=env_intvalue("OPENCL_LIBSMM_SMM_TB", "0"), - dest="tb", - help="Matrix B: untracked (0), tracked (1)", - ) - argparser.add_argument( - "-tc", - "--initial-tc", - type=int, - default=env_intvalue("OPENCL_LIBSMM_SMM_TC", "1"), - dest="tc", - help="Matrix C: untracked (0), tracked (1)", - ) - argparser.add_argument( - "-ap", - "--initial-ap", - type=int, - default=env_intvalue("OPENCL_LIBSMM_SMM_AP", "0"), - dest="ap", - help="Params: global (0), shared (1)", - ) - argparser.add_argument( - "-aa", - "--initial-aa", - type=int, - default=env_intvalue("OPENCL_LIBSMM_SMM_AA", "0"), - dest="aa", - help="Matrix A: global (0), shared (1), register (2)", - ) - argparser.add_argument( - "-ab", - "--initial-ab", - type=int, - default=env_intvalue("OPENCL_LIBSMM_SMM_AB", "0"), - dest="ab", - help="Matrix B: global (0), shared (1), register (2)", - ) - argparser.add_argument( - "-ac", - "--initial-ac", - type=int, - default=env_intvalue("OPENCL_LIBSMM_SMM_AC", "0"), - dest="ac", - help="Matrix C: register (0), shared (1)", - ) - argparser.add_argument( - "-bs", - "--initial-bs", - type=int, - default=env_intvalue("OPENCL_LIBSMM_SMM_BS", "0"), - nargs="?", - dest="bs", - help="Minibatch size (0:auto)", - ) - argparser.add_argument( - "-mb", - "--max-bs", - type=int, - default=0, - nargs="?", - dest="mb", - help="Maximum (mini-)batch size (0:auto)", - ) - argparser.add_argument( - "-s", - "--batchsize", - type=int, - default=0, - nargs="?", - dest="size", - help="Size of batch (a.k.a. stacksize)", - ) - args, argd = argparser.parse_args(), argparser.parse_args([]) - # OPENCL_LIBSMM_SMM_xx=tune|enabled|on must be given to permit tuning) - if os.getenv("OPENCL_LIBSMM_SMM_WS") not in default_enable_tune: - os.environ["OPENCL_LIBSMM_SMM_WS"] = "{}".format(args.ws) - # fix tunables according to level of tuning - if 1 <= args.tlevel or 0 > args.tlevel: - os.environ["OPENCL_LIBSMM_SMM_BM"] = "{}".format(args.bm) - os.environ["OPENCL_LIBSMM_SMM_BN"] = "{}".format(args.bn) - os.environ["OPENCL_LIBSMM_SMM_AL"] = "{}".format(args.al) - if 2 <= args.tlevel or 0 > args.tlevel: - os.environ["OPENCL_LIBSMM_SMM_TB"] = "{}".format(args.tb) - os.environ["OPENCL_LIBSMM_SMM_TC"] = "{}".format(args.tc) - os.environ["OPENCL_LIBSMM_SMM_AP"] = "{}".format(args.ap) - os.environ["OPENCL_LIBSMM_SMM_AC"] = "{}".format(args.ac) - os.environ["OPENCL_LIBSMM_SMM_NZ"] = "{}".format(args.nz) - if 3 <= args.tlevel: - os.environ["OPENCL_LIBSMM_SMM_BK"] = "{}".format(args.bk) - os.environ["OPENCL_LIBSMM_SMM_WG"] = "{}".format(args.wg) - if 4 <= args.tlevel: - os.environ["OPENCL_LIBSMM_SMM_LU"] = "{}".format(args.lu) - if 0 == args.mb: - args.mb = 64 - # construct and start tuner instance - if os.path.isfile(args.mnk): - with open(args.mnk, "r") as file: - while True: - line = file.readline() - if not line: - break - args.mnk, args.label = line.strip(), "" - if args.mnk: - start(args) - print("") - else: - if os.path.isdir(args.mnk): - args.jsondir = args.mnk - args.mnk = default_mnk - if args.merge is None: - args.merge = -1 - else: - try: - mnk = tuple(max(int(i), 1) for i in args.mnk.split("x")) - except: # noqa: E722 - mnk = None - pass - if not mnk: - sys.tracebacklimit = 0 - raise RuntimeError("Cannot parse MxNxK triplet or filename.") - start(args) diff --git a/src/acc/opencl/smm/tune_multiply.sh b/src/acc/opencl/smm/tune_multiply.sh deleted file mode 100755 index 1054c61fb23..00000000000 --- a/src/acc/opencl/smm/tune_multiply.sh +++ /dev/null @@ -1,279 +0,0 @@ -#!/usr/bin/env bash -#################################################################################################### -# Copyright (C) by the DBCSR developers group - All rights reserved # -# This file is part of the DBCSR library. # -# # -# For information on the license, see the LICENSE file. # -# For further information please visit https://dbcsr.cp2k.org # -# SPDX-License-Identifier: BSD-3-Clause # -#################################################################################################### - -XARGS=$(command -v xargs) -SORT=$(command -v sort) -HEAD=$(command -v head) -SED=$(command -v gsed) -CUT=$(command -v cut) -LS=$(command -v ls) -RM=$(command -v rm) -WC=$(command -v wc) - -# initial delay before auto-tuning (interactive) -WAIT_DEFAULT=12 - -# GNU sed is desired (macOS) -if [ ! "${SED}" ]; then - SED=$(command -v sed) -fi - -if [ "${XARGS}" ] && [ "${SORT}" ] && [ "${HEAD}" ] && [ "${SED}" ] && \ - [ "${LS}" ] && [ "${RM}" ] && [ "${WC}" ]; -then - EXTRA="" - while test $# -gt 0; do - case "$1" in - -h|--help) - HELP=1 - shift $#;; - -c|--continue) - CONTINUE=1 - shift 1;; - -w|--wait) - WAIT=$2 - shift 2;; - -u|--update) - UPDATE=1 - shift 1;; - -d|--delete) - DELETE=1 - shift 1;; - -a|--tuning-level) - TLEVEL=$2 - shift 2;; - -b|--backwards) - REVERSE=1 - shift 1;; - -t|--maxtime) - MAXTIME=$2 - shift 2;; - -p|--jsondir) - JSONDIR=$2 - shift 2;; - -k|--specid) - SPECID=$2 - shift 2;; - -m|--limit) - MAXEXT=$2 - shift 2;; - -n|--triplets) - MAXNUM=$2 - shift 2;; - -r|--bound) - BOUNDL=$2 - BOUNDU=$3 - shift 3;; - -i|--part) - PART=$2 - shift 2;; - -j|--nparts) - NPARTS=$2 - shift 2;; - -s|--batchsize) - BATCHSIZE=$2 - shift 2;; - *) - if [ "-" != "${1:0:1}" ]; then - break - else - EXTRA+=" $1" - shift - fi;; - esac - done - # default/basic settings - if [ ! "${BATCHSIZE}" ]; then BATCHSIZE=0; fi - if [ ! "${JSONDIR}" ]; then JSONDIR=.; fi - if [ ! "${TLEVEL}" ]; then TLEVEL=-1; fi - if [ ! "${NPARTS}" ]; then NPARTS=${PMI_SIZE:-${OMPI_COMM_WORLD_SIZE:-1}}; fi - if [ ! "${PART}" ]; then - PART0=${PMI_RANK:-${OMPI_COMM_WORLD_RANK:-0}} - PART=$(((PART0+1)%NPARTS+1)) - fi - if [ ! "${WAIT}" ] && [ "1" != "${NPARTS}" ]; then WAIT=0; fi - # sanity checks - if [ "0" != "$((NPARTS&2 echo "ERROR: part-number ${PART} is larger than the requested ${NPARTS} parts!" - exit 1 - elif [ "0" != "$((1>PART))" ]; then - >&2 echo "ERROR: part-number must be 1-based!" - exit 1 - fi - if [ "${SPECID}" ] && [ "$1" ]; then - >&2 echo "ERROR: --specid and are mutual exclusive!" - exit 1 - fi - # how to print standard vs error messages - if [ ! "${HELP}" ] || [ "0" = "${HELP}" ]; then - JSONS=$(${LS} -1 ${JSONDIR}/tune_multiply-*-*x*x*-*gflops.json 2>/dev/null) - HERE=$(cd "$(dirname "$0")" && pwd -P) - ECHO=">&2 echo" - if [ "${UPDATE}" ] && [ "0" != "${UPDATE}" ]; then - MNKS=$(${SED} -n "s/.*tune_multiply-..*-\(..*x..*x.[^-]*\)-..*gflops\.json/\1/p" <<<"${JSONS}" \ - | ${SORT} -u -n -tx -k1,1 -k2,2 -k3,3) - elif [ "${SPECID}" ]; then - MNKS=$(eval "${HERE}/../../acc_triplets.sh -k ${SPECID} 2>/dev/null") - else - if [[ "$*" != *"x"* ]]; then - MNKS=$(eval "${HERE}/../../acc_triplets.sh $* 2>/dev/null") - else - MNKS="$*" - fi - fi - else - ECHO="echo" - fi - if [ ! "${WAIT}" ] || [[ ("${HELP}" && "0" != "${HELP}") ]]; then - eval "${ECHO} \"Usage: $0 [options] []\"" - eval "${ECHO} \" Options must precede triplet specification\"" - eval "${ECHO} \" -w|--wait N: initial delay before auto-tuning (default: ${WAIT_DEFAULT} s)\"" - eval "${ECHO} \" -c|--continue: proceed with plan if tuning is interrupted\"" - eval "${ECHO} \" -u|--update: retune all JSONs found in directory (see -p)\"" - eval "${ECHO} \" -s|--batchsize N: Number of batched SMMs (a.k.a. stacksize)\"" - eval "${ECHO} \" -a|--tuning-level N=0..3: all, most, some, least tunables\"" - eval "${ECHO} \" -b|--backwards: tune in descending order of triplets\"" - eval "${ECHO} \" -t|--maxtime N: number of seconds spent per kernel\"" - eval "${ECHO} \" -p|--jsondir P: path to JSON-files (tuned params)\"" - eval "${ECHO} \" -i|--part N (1-based): Nth session out of nparts\"" - eval "${ECHO} \" -j|--nparts N: number of total sessions (see -i)\"" - eval "${ECHO} \" -r|--bound L U: limit L**3 < MNK <= U**3\"" - eval "${ECHO} \" -m|--limit N: limit any shape extent to N\"" - eval "${ECHO} \" -n|--triplets N: limit number of triplet\"" - eval "${ECHO} \" -k|--specid N: predefined triplets\"" - eval "${ECHO} \" 0-10: older to newer (larger), e.g.,\"" - eval "${ECHO} \" 0: 201 kernels\"" - eval "${ECHO} \" 10: 1266 kernels\"" - eval "${ECHO} \" , e.g., 134 kernels \\\"23, 5 32 13 24 26, 4 9\\\"\"" - eval "${ECHO} \" MxNxK's can be also given directly, e.g.,\"" - eval "${ECHO} \" 1x1x1 2x2x2 2x2x3 2x3x2 2x3x3 3x2x2 3x2x3 3x3x2 3x3x3\"" - eval "${ECHO} \" (which is equivalent to \\\"1, 2 3\\\")\"" - eval "${ECHO}" - if [ "${HELP}" ] && [ "0" != "${HELP}" ]; then exit 0; fi - fi - if [ "${MNKS}" ]; then - if [ "${BOUNDL}" ] || [ "${BOUNDU}" ]; then - if [ ! "${BOUNDL}" ]; then BOUNDL=0; elif [ ! "${BOUNDU}" ]; then BOUNDU=0; fi - if [ "0" != "$((0<=BOUNDL))" ]; then - for MNK in $(${SED} "s/x/*/g" <<<"${MNKS}"); do - S=$((MNK)) - if [ "0" != "$((BOUNDL&2 echo "ERROR: invalid or no given!" - exit 1 - fi - if [ ! "${WAIT}" ] || [ "0" != "${WAIT}" ]; then - if [ "0" = "$((NPARTS<=NTRIPLETS))" ]; then - >&2 echo "WARNING: problem is over-decomposed!" - fi - echo "Session ${PART} of ${NPARTS} part(s)." - fi - if [ ! "${MAXTIME}" ] && [[ (! "${CONTINUE}" || \ - "${CONTINUE}" = "false" || \ - "${CONTINUE}" = "no" || \ - "${CONTINUE}" = "0") ]]; - then - MAXTIME=160 - fi - PARTLOSZ=$((NPARTS&2 echo "Already found ${NJSONS} (unrelated?) JSON-files." - fi - elif [ -e tune_multiply.csv ]; then - >&2 echo "No JSON file found but (unrelated?) tune_multiply.csv exists." - fi - if [ ! "${WAIT}" ]; then WAIT=${WAIT_DEFAULT}; fi - if [ "0" != "$((0&2 echo "ERROR: missing prerequisites!" - exit 1 -fi diff --git a/src/base/dbcsr_base_uses.f90 b/src/base/dbcsr_base_uses.f90 index 062f8b2e845..5c317e1ed30 100644 --- a/src/base/dbcsr_base_uses.f90 +++ b/src/base/dbcsr_base_uses.f90 @@ -58,15 +58,6 @@ #endif !&> -! LIBXSMM has a FORTRAN-suitable header with macro/version definitions (since v1.8.2). -! Allows macro-toggles (in addition to parameters). -#if defined(__LIBXSMM) -#include -#if !defined(LIBXSMM_CONFIG_VERSION) -#error LIBXSMM v1.8.2 or later is required! -#endif -#endif - ! Aliasing __MPI_F08 macro of CP2K to __USE_MPI_F08 macro in DBCSR #if defined(__parallel) && defined(__MPI_F08) #define __USE_MPI_F08 1 diff --git a/src/base/dbcsr_machine.F b/src/base/dbcsr_machine.F index 8cebf095494..8db8bd0a47c 100644 --- a/src/base/dbcsr_machine.F +++ b/src/base/dbcsr_machine.F @@ -58,13 +58,13 @@ FUNCTION m_walltime() RESULT(wt) !! same implementation for all machines. !! might still roll, if not called multiple times per count_max/count_rate -#if defined(__LIBXSMM) - USE libxsmm, ONLY: libxsmm_timer_tick, libxsmm_timer_duration +#if defined(__LIBXS) + USE LIBXS, ONLY: libxs_timer_tick, libxs_timer_duration #endif REAL(KIND=dp) :: wt -#if defined(__LIBXSMM) - wt = libxsmm_timer_duration(0_int_8, libxsmm_timer_tick()) +#if defined(__LIBXS) + wt = libxs_timer_duration(0_int_8, libxs_timer_tick()) #else INTEGER(KIND=int_8) :: count diff --git a/src/block/dbcsr_block_operations.F b/src/block/dbcsr_block_operations.F index 28f72d98b0a..42743b0348c 100644 --- a/src/block/dbcsr_block_operations.F +++ b/src/block/dbcsr_block_operations.F @@ -31,17 +31,9 @@ MODULE dbcsr_block_operations #include "base/dbcsr_base_uses.f90" IMPLICIT NONE -#if defined(__LIBXSMM) && TO_VERSION(1, 10) < TO_VERSION(LIBXSMM_CONFIG_VERSION_MAJOR, LIBXSMM_CONFIG_VERSION_MINOR) -# define __LIBXSMM_BLOCKOPS -#endif -#if defined(__LIBXSMM) && TO_VERSION(1, 10) <= TO_VERSION(LIBXSMM_CONFIG_VERSION_MAJOR, LIBXSMM_CONFIG_VERSION_MINOR) -# define __LIBXSMM_TRANS -#endif -#if defined(__MKL) || defined(__LIBXSMM_TRANS) || defined(__LIBXSMM_BLOCKOPS) || !defined(NDEBUG) -! MKL: mkl_trans.fi header is obsolescent (use implicit "interface") +#if defined(__MKL) || defined(__LIBXS) || !defined(NDEBUG) # define PURE_BLOCKOPS #else -! MKL: routines are impure, LIBXSMM: C_LOC is impure (F-standard mistake) # define PURE_BLOCKOPS PURE #endif PRIVATE @@ -1455,15 +1447,15 @@ PURE_BLOCKOPS SUBROUTINE block_partial_copy_${nametype1}$ (dst, dst_rs, dst_cs, !! see block_partial_copy_a !! @endnote -#if defined(__LIBXSMM_BLOCKOPS) - USE libxsmm, ONLY: libxsmm_matcopy, libxsmm_otrans, libxsmm_ptr0 +#if defined(__LIBXS) + USE LIBXS, ONLY: libxs_matcopy, libxs_otrans, C_LOC #endif - ${type1}$, DIMENSION(:), & + ${type1}$, DIMENSION(:), TARGET, & INTENT(INOUT) :: dst INTEGER, INTENT(IN) :: dst_rs, dst_cs INTEGER, INTENT(IN) :: src_offset, dst_offset LOGICAL, INTENT(IN) :: dst_tr - ${type1}$, DIMENSION(:), & + ${type1}$, DIMENSION(:), TARGET, & INTENT(IN) :: src INTEGER, INTENT(IN) :: src_rs, src_cs LOGICAL, INTENT(IN) :: src_tr @@ -1475,11 +1467,11 @@ PURE_BLOCKOPS SUBROUTINE block_partial_copy_${nametype1}$ (dst, dst_rs, dst_cs, ! Factors out the 4 combinations to remove branches from the inner loop. ! rs is the logical row size so it always remains the leading dimension. IF (.NOT. dst_tr .AND. .NOT. src_tr) THEN -#if defined(__LIBXSMM_BLOCKOPS) +#if defined(__LIBXS) IF ((0 .LT. ncol) .AND. (0 .LT. nrow)) THEN - CALL libxsmm_matcopy(libxsmm_ptr0(dst(dst_offset + dst_r_lb + (dst_c_lb - 1)*dst_rs)), & - libxsmm_ptr0(src(src_offset + src_r_lb + (src_c_lb - 1)*src_rs)), & - ${typesize1[n]}$, nrow, ncol, src_rs, dst_rs) + CALL libxs_matcopy(C_LOC(dst(dst_offset + dst_r_lb + (dst_c_lb - 1)*dst_rs)), & + C_LOC(src(src_offset + src_r_lb + (src_c_lb - 1)*src_rs)), & + ${typesize1[n]}$, nrow, ncol, src_rs, dst_rs) END IF #else DO col = 0, ncol - 1 @@ -1505,11 +1497,11 @@ PURE_BLOCKOPS SUBROUTINE block_partial_copy_${nametype1}$ (dst, dst_rs, dst_cs, END DO ELSE DBCSR_ASSERT(dst_tr .AND. src_tr) -#if defined(__LIBXSMM_BLOCKOPS) +#if defined(__LIBXS) IF ((0 .LT. ncol) .AND. (0 .LT. nrow)) THEN - CALL libxsmm_matcopy(libxsmm_ptr0(dst(dst_offset + dst_c_lb + (dst_r_lb - 1)*dst_cs)), & - libxsmm_ptr0(src(src_offset + src_c_lb + (src_r_lb - 1)*src_cs)), & - ${typesize1[n]}$, nrow, ncol, src_cs, dst_cs) + CALL libxs_matcopy(C_LOC(dst(dst_offset + dst_c_lb + (dst_r_lb - 1)*dst_cs)), & + C_LOC(src(src_offset + src_c_lb + (src_r_lb - 1)*src_cs)), & + ${typesize1[n]}$, nrow, ncol, src_cs, dst_cs) END IF #else DO col = 0, ncol - 1 @@ -1531,17 +1523,17 @@ PURE_BLOCKOPS SUBROUTINE block_partial_copy_1d2d_${nametype1}$ (dst, dst_rs, dst !! see block_partial_copy_a !! @endnote -#if defined(__LIBXSMM_BLOCKOPS) - USE libxsmm, ONLY: libxsmm_matcopy, libxsmm_otrans, libxsmm_ptr0 +#if defined(__LIBXS) + USE LIBXS, ONLY: libxs_matcopy, libxs_otrans, C_LOC #else INTEGER :: col, row #endif - ${type1}$, DIMENSION(:), & + ${type1}$, DIMENSION(:), TARGET, & INTENT(INOUT) :: dst INTEGER, INTENT(IN) :: dst_rs, dst_cs INTEGER, INTENT(IN) :: dst_offset LOGICAL, INTENT(IN) :: dst_tr - ${type1}$, DIMENSION(:, :), & + ${type1}$, DIMENSION(:, :), TARGET, & INTENT(IN) :: src LOGICAL, INTENT(IN) :: src_tr INTEGER, INTENT(IN) :: dst_r_lb, dst_c_lb, src_r_lb, & @@ -1551,11 +1543,11 @@ PURE_BLOCKOPS SUBROUTINE block_partial_copy_1d2d_${nametype1}$ (dst, dst_rs, dst ! Factors out the 4 combinations to remove branches from the inner loop. ! rs is the logical row size so it always remains the leading dimension. IF (.NOT. dst_tr .AND. .NOT. src_tr) THEN -#if defined(__LIBXSMM_BLOCKOPS) +#if defined(__LIBXS) IF ((0 .LT. ncol) .AND. (0 .LT. nrow)) THEN - CALL libxsmm_matcopy(libxsmm_ptr0(dst(dst_offset + dst_r_lb + (dst_c_lb - 1)*dst_rs)), & - libxsmm_ptr0(src(src_r_lb, src_c_lb)), & - ${typesize1[n]}$, nrow, ncol, SIZE(src, 1), dst_rs) + CALL libxs_matcopy(C_LOC(dst(dst_offset + dst_r_lb + (dst_c_lb - 1)*dst_rs)), & + C_LOC(src(src_r_lb, src_c_lb)), & + ${typesize1[n]}$, nrow, ncol, SIZE(src, 1), dst_rs) END IF #else DO col = 0, ncol - 1 @@ -1566,11 +1558,11 @@ PURE_BLOCKOPS SUBROUTINE block_partial_copy_1d2d_${nametype1}$ (dst, dst_rs, dst END DO #endif ELSEIF (dst_tr .AND. .NOT. src_tr) THEN -#if defined(__LIBXSMM_BLOCKOPS) +#if defined(__LIBXS) IF ((0 .LT. ncol) .AND. (0 .LT. nrow)) THEN - CALL libxsmm_otrans(libxsmm_ptr0(dst(dst_offset + dst_c_lb + (dst_r_lb - 1)*dst_cs)), & - libxsmm_ptr0(src(src_r_lb, src_c_lb)), & - ${typesize1[n]}$, nrow, ncol, SIZE(src, 1), dst_cs) + CALL libxs_otrans(C_LOC(dst(dst_offset + dst_c_lb + (dst_r_lb - 1)*dst_cs)), & + C_LOC(src(src_r_lb, src_c_lb)), & + ${typesize1[n]}$, nrow, ncol, SIZE(src, 1), dst_cs) END IF #else DO col = 0, ncol - 1 @@ -1581,11 +1573,11 @@ PURE_BLOCKOPS SUBROUTINE block_partial_copy_1d2d_${nametype1}$ (dst, dst_rs, dst END DO #endif ELSEIF (.NOT. dst_tr .AND. src_tr) THEN -#if defined(__LIBXSMM_BLOCKOPS) +#if defined(__LIBXS) IF ((0 .LT. ncol) .AND. (0 .LT. nrow)) THEN - CALL libxsmm_otrans(libxsmm_ptr0(dst(dst_offset + dst_r_lb + (dst_c_lb - 1)*dst_rs)), & - libxsmm_ptr0(src(src_c_lb, src_r_lb)), & - ${typesize1[n]}$, nrow, ncol, SIZE(src, 2), dst_rs) + CALL libxs_otrans(C_LOC(dst(dst_offset + dst_r_lb + (dst_c_lb - 1)*dst_rs)), & + C_LOC(src(src_c_lb, src_r_lb)), & + ${typesize1[n]}$, nrow, ncol, SIZE(src, 2), dst_rs) END IF #else DO col = 0, ncol - 1 @@ -1597,11 +1589,11 @@ PURE_BLOCKOPS SUBROUTINE block_partial_copy_1d2d_${nametype1}$ (dst, dst_rs, dst #endif ELSE DBCSR_ASSERT(dst_tr .AND. src_tr) -#if defined(__LIBXSMM_BLOCKOPS) +#if defined(__LIBXS) IF ((0 .LT. ncol) .AND. (0 .LT. nrow)) THEN - CALL libxsmm_matcopy(libxsmm_ptr0(dst(dst_offset + dst_c_lb + (dst_r_lb - 1)*dst_cs)), & - libxsmm_ptr0(src(src_c_lb, src_r_lb)), & - ${typesize1[n]}$, nrow, ncol, SIZE(src, 2), dst_cs) + CALL libxs_matcopy(C_LOC(dst(dst_offset + dst_c_lb + (dst_r_lb - 1)*dst_cs)), & + C_LOC(src(src_c_lb, src_r_lb)), & + ${typesize1[n]}$, nrow, ncol, SIZE(src, 2), dst_cs) END IF #else DO col = 0, ncol - 1 @@ -1623,8 +1615,8 @@ PURE_BLOCKOPS SUBROUTINE block_partial_copy_2d1d_${nametype1}$ (dst, dst_tr, & !! see block_partial_copy_a !! @endnote -#if defined(__LIBXSMM_BLOCKOPS) - USE libxsmm, ONLY: libxsmm_matcopy, libxsmm_otrans, libxsmm_ptr0 +#if defined(__LIBXS) + USE LIBXS, ONLY: libxs_matcopy, libxs_otrans, C_LOC #endif ${type1}$, DIMENSION(:, :), & INTENT(INOUT) :: dst @@ -1681,15 +1673,15 @@ PURE_BLOCKOPS SUBROUTINE block_partial_copy_2d2d_${nametype1}$ (dst, dst_tr, & !! see block_partial_copy_a !! @endnote -#if defined(__LIBXSMM_BLOCKOPS) - USE libxsmm, ONLY: libxsmm_matcopy, libxsmm_otrans, libxsmm_ptr0 +#if defined(__LIBXS) + USE LIBXS, ONLY: libxs_matcopy, libxs_otrans, C_LOC #else INTEGER :: col, row #endif - ${type1}$, DIMENSION(:, :), & + ${type1}$, DIMENSION(:, :), TARGET, & INTENT(INOUT) :: dst LOGICAL, INTENT(IN) :: dst_tr - ${type1}$, DIMENSION(:, :), & + ${type1}$, DIMENSION(:, :), TARGET, & INTENT(IN) :: src LOGICAL, INTENT(IN) :: src_tr INTEGER, INTENT(IN) :: dst_r_lb, dst_c_lb, src_r_lb, & @@ -1699,12 +1691,12 @@ PURE_BLOCKOPS SUBROUTINE block_partial_copy_2d2d_${nametype1}$ (dst, dst_tr, & ! Factors out the 4 combinations to remove branches from the inner loop. ! rs is the logical row size so it always remains the leading dimension. IF (.NOT. dst_tr .AND. .NOT. src_tr) THEN -#if defined(__LIBXSMM_BLOCKOPS) +#if defined(__LIBXS) IF ((0 .LT. ncol) .AND. (0 .LT. nrow)) THEN - CALL libxsmm_matcopy(libxsmm_ptr0(dst(dst_r_lb, dst_c_lb)), & - libxsmm_ptr0(src(src_r_lb, src_c_lb)), & - ${typesize1[n]}$, nrow, ncol, & - SIZE(src, 1), SIZE(dst, 1)) + CALL libxs_matcopy(C_LOC(dst(dst_r_lb, dst_c_lb)), & + C_LOC(src(src_r_lb, src_c_lb)), & + ${typesize1[n]}$, nrow, ncol, & + SIZE(src, 1), SIZE(dst, 1)) END IF #else DO col = 0, ncol - 1 @@ -1715,12 +1707,12 @@ PURE_BLOCKOPS SUBROUTINE block_partial_copy_2d2d_${nametype1}$ (dst, dst_tr, & END DO #endif ELSEIF (dst_tr .AND. .NOT. src_tr) THEN -#if defined(__LIBXSMM_BLOCKOPS) +#if defined(__LIBXS) IF ((0 .LT. ncol) .AND. (0 .LT. nrow)) THEN - CALL libxsmm_otrans(libxsmm_ptr0(dst(dst_c_lb, dst_r_lb)), & - libxsmm_ptr0(src(src_r_lb, src_c_lb)), & - ${typesize1[n]}$, nrow, ncol, & - SIZE(src, 1), SIZE(dst, 2)) + CALL libxs_otrans(C_LOC(dst(dst_c_lb, dst_r_lb)), & + C_LOC(src(src_r_lb, src_c_lb)), & + ${typesize1[n]}$, nrow, ncol, & + SIZE(src, 1), SIZE(dst, 2)) END IF #else DO col = 0, ncol - 1 @@ -1731,12 +1723,12 @@ PURE_BLOCKOPS SUBROUTINE block_partial_copy_2d2d_${nametype1}$ (dst, dst_tr, & END DO #endif ELSEIF (.NOT. dst_tr .AND. src_tr) THEN -#if defined(__LIBXSMM_BLOCKOPS) +#if defined(__LIBXS) IF ((0 .LT. ncol) .AND. (0 .LT. nrow)) THEN - CALL libxsmm_otrans(libxsmm_ptr0(dst(dst_r_lb, dst_c_lb)), & - libxsmm_ptr0(src(src_c_lb, src_r_lb)), & - ${typesize1[n]}$, nrow, ncol, & - SIZE(src, 2), SIZE(dst, 1)) + CALL libxs_otrans(C_LOC(dst(dst_r_lb, dst_c_lb)), & + C_LOC(src(src_c_lb, src_r_lb)), & + ${typesize1[n]}$, nrow, ncol, & + SIZE(src, 2), SIZE(dst, 1)) END IF #else DO col = 0, ncol - 1 @@ -1748,12 +1740,12 @@ PURE_BLOCKOPS SUBROUTINE block_partial_copy_2d2d_${nametype1}$ (dst, dst_tr, & #endif ELSE DBCSR_ASSERT(dst_tr .AND. src_tr) -#if defined(__LIBXSMM_BLOCKOPS) +#if defined(__LIBXS) IF ((0 .LT. ncol) .AND. (0 .LT. nrow)) THEN - CALL libxsmm_matcopy(libxsmm_ptr0(dst(dst_c_lb, dst_r_lb)), & - libxsmm_ptr0(src(src_c_lb, src_r_lb)), & - ${typesize1[n]}$, nrow, ncol, & - SIZE(src, 2), SIZE(dst, 2)) + CALL libxs_matcopy(C_LOC(dst(dst_c_lb, dst_r_lb)), & + C_LOC(src(src_c_lb, src_r_lb)), & + ${typesize1[n]}$, nrow, ncol, & + SIZE(src, 2), SIZE(dst, 2)) END IF #else DO col = 0, ncol - 1 @@ -1786,21 +1778,21 @@ PURE_BLOCKOPS SUBROUTINE block_transpose_copy_${nametype1}$ (extent_out, extent_ rows, columns) !! Copy and transpose block. -#if defined(__LIBXSMM_TRANS) - USE libxsmm, ONLY: libxsmm_otrans, libxsmm_ptr1 +#if defined(__LIBXS) + USE LIBXS, ONLY: libxs_otrans, C_LOC #endif ${type1}$, DIMENSION(:), INTENT(OUT), TARGET :: extent_out !! output matrix in the form of a 1-d array - ${type1}$, DIMENSION(:), INTENT(IN) :: extent_in + ${type1}$, DIMENSION(:), INTENT(IN), TARGET :: extent_in !! input matrix in the form of a 1-d array INTEGER, INTENT(IN) :: rows, columns !! input matrix size !! input matrix size ! --------------------------------------------------------------------------- -#if defined(__LIBXSMM_TRANS) - CALL libxsmm_otrans(libxsmm_ptr1(extent_out), libxsmm_ptr1(extent_in), & - ${typesize1[n]}$, rows, columns, rows, columns) +#if defined(__LIBXS) + CALL libxs_otrans(C_LOC(extent_out), C_LOC(extent_in), & + ${typesize1[n]}$, rows, columns, rows, columns) #elif defined(__MKL) CALL mkl_${nametype1}$omatcopy('C', 'T', rows, columns, ${one1[n]}$, extent_in, rows, extent_out, columns) #else @@ -1861,21 +1853,21 @@ PURE_BLOCKOPS SUBROUTINE block_transpose_copy_2d1d_${nametype1}$ (extent_out, ex rows, columns) !! Copy and transpose block. -#if defined(__LIBXSMM_TRANS) - USE libxsmm, ONLY: libxsmm_otrans, libxsmm_ptr1, libxsmm_ptr2 +#if defined(__LIBXS) + USE LIBXS, ONLY: libxs_otrans, C_LOC #endif INTEGER, INTENT(IN) :: rows, columns !! input matrix size !! input matrix size ${type1}$, DIMENSION(columns, rows), INTENT(OUT), TARGET :: extent_out !! output matrix in the form of a 2-d array - ${type1}$, DIMENSION(:), INTENT(IN) :: extent_in + ${type1}$, DIMENSION(:), INTENT(IN), TARGET :: extent_in !! input matrix in the form of a 1-d array ! --------------------------------------------------------------------------- -#if defined(__LIBXSMM_TRANS) - CALL libxsmm_otrans(libxsmm_ptr2(extent_out), libxsmm_ptr1(extent_in), & - ${typesize1[n]}$, rows, columns, rows, columns) +#if defined(__LIBXS) + CALL libxs_otrans(C_LOC(extent_out), C_LOC(extent_in), & + ${typesize1[n]}$, rows, columns, rows, columns) #elif defined(__MKL) CALL mkl_${nametype1}$omatcopy('C', 'T', rows, columns, ${one1[n]}$, extent_in, rows, extent_out, columns) #else @@ -1903,21 +1895,21 @@ PURE_BLOCKOPS SUBROUTINE block_transpose_copy_1d2d_${nametype1}$ (extent_out, ex rows, columns) !! Copy and transpose block. -#if defined(__LIBXSMM_TRANS) - USE libxsmm, ONLY: libxsmm_otrans, libxsmm_ptr1, libxsmm_ptr2 +#if defined(__LIBXS) + USE LIBXS, ONLY: libxs_otrans, C_LOC #endif INTEGER, INTENT(IN) :: rows, columns !! input matrix size !! input matrix size - ${type1}$, DIMENSION(:), INTENT(OUT), TARGET :: extent_out + ${type1}$, DIMENSION(:), INTENT(OUT), TARGET :: extent_out !! output matrix in the form of a 1-d array - ${type1}$, DIMENSION(rows, columns), INTENT(IN) :: extent_in + ${type1}$, DIMENSION(rows, columns), INTENT(IN), TARGET :: extent_in !! input matrix in the form of a 2-d array ! --------------------------------------------------------------------------- -#if defined(__LIBXSMM_TRANS) - CALL libxsmm_otrans(libxsmm_ptr1(extent_out), libxsmm_ptr2(extent_in), & - ${typesize1[n]}$, rows, columns, rows, columns) +#if defined(__LIBXS) + CALL libxs_otrans(C_LOC(extent_out), C_LOC(extent_in), & + ${typesize1[n]}$, rows, columns, rows, columns) #elif defined(__MKL) CALL mkl_${nametype1}$omatcopy('C', 'T', rows, columns, ${one1[n]}$, extent_in, rows, extent_out, columns) #else @@ -1928,8 +1920,8 @@ END SUBROUTINE block_transpose_copy_1d2d_${nametype1}$ PURE_BLOCKOPS SUBROUTINE block_transpose_inplace_${nametype1}$ (extent, rows, columns) !! In-place block transpose. -#if defined(__LIBXSMM_TRANS) && 0 - USE libxsmm, ONLY: libxsmm_itrans, libxsmm_ptr1 +#if defined(__LIBXS) && 0 + USE LIBXS, ONLY: libxs_otrans, C_LOC #endif INTEGER, INTENT(IN) :: rows, columns !! input matrix size @@ -1938,8 +1930,8 @@ PURE_BLOCKOPS SUBROUTINE block_transpose_inplace_${nametype1}$ (extent, rows, co !! Matrix in the form of a 1-d array ! --------------------------------------------------------------------------- -#if defined(__LIBXSMM_TRANS) && 0 - CALL libxsmm_itrans(libxsmm_ptr1(extent), ${typesize1[n]}$, rows, columns, rows) +#if defined(__LIBXS) && 0 + CALL libxs_otrans(C_LOC(extent), ${typesize1[n]}$, rows, columns, rows) #elif defined(__MKL) CALL mkl_${nametype1}$imatcopy('C', 'T', rows, columns, ${one1[n]}$, extent, rows, columns) #else diff --git a/src/cmake/DBCSRConfig.cmake.in b/src/cmake/DBCSRConfig.cmake.in index 764ceb73639..eb47f381053 100644 --- a/src/cmake/DBCSRConfig.cmake.in +++ b/src/cmake/DBCSRConfig.cmake.in @@ -28,13 +28,8 @@ if ("@USE_ACCEL@" MATCHES "hip") find_dependency(hiprtc) endif () -if (("@USE_SMM@" MATCHES "libxsmm") OR ("@USE_ACCEL@" MATCHES "opencl")) - set(DBCSR_USE_SMM @USE_SMM@) - find_package(PkgConfig) - pkg_check_modules(LIBXSMM IMPORTED_TARGET GLOBAL libxsmmf) - if (@USE_OPENMP@) - pkg_check_modules(LIBXSMMEXT IMPORTED_TARGET GLOBAL libxsmmext) - endif () +if ("@USE_ACCEL@" MATCHES "opencl") + find_dependency(OpenCL) endif () include("${CMAKE_CURRENT_LIST_DIR}/DBCSRTargets.cmake") diff --git a/src/core/dbcsr_array_types.F b/src/core/dbcsr_array_types.F index 9013b0cf320..529efc1afdb 100644 --- a/src/core/dbcsr_array_types.F +++ b/src/core/dbcsr_array_types.F @@ -11,8 +11,8 @@ MODULE dbcsr_array_types !! Array objects with reference counting. #include "base/dbcsr_base_uses.f90" -#if TO_VERSION(1, 11) <= TO_VERSION(LIBXSMM_CONFIG_VERSION_MAJOR, LIBXSMM_CONFIG_VERSION_MINOR) - USE libxsmm, ONLY: libxsmm_diff +#if defined(__LIBXS) + USE LIBXS, ONLY: libxs_diff # define PURE_ARRAY_EQUALITY #else # define PURE_ARRAY_EQUALITY PURE @@ -170,8 +170,8 @@ PURE_ARRAY_EQUALITY FUNCTION array_equality_i1(array1, array2) RESULT(are_equal) are_equal = .FALSE. IF (ASSOCIATED(array1) .AND. ASSOCIATED(array2)) THEN -#if TO_VERSION(1, 11) <= TO_VERSION(LIBXSMM_CONFIG_VERSION_MAJOR, LIBXSMM_CONFIG_VERSION_MINOR) - are_equal = .NOT. libxsmm_diff(array1, array2) +#if defined(__LIBXS) + are_equal = .NOT. libxs_diff(array1, array2) #else IF (SIZE(array1) .NE. SIZE(array2)) RETURN are_equal = ALL(array1 .EQ. array2) @@ -185,8 +185,8 @@ PURE_ARRAY_EQUALITY FUNCTION array_equality_i1d(array1, array2) RESULT(are_equal are_equal = .FALSE. IF (ASSOCIATED(array1%low) .AND. ASSOCIATED(array2%low)) THEN -#if TO_VERSION(1, 11) <= TO_VERSION(LIBXSMM_CONFIG_VERSION_MAJOR, LIBXSMM_CONFIG_VERSION_MINOR) - are_equal = .NOT. libxsmm_diff(array1%low%data, array2%low%data) +#if defined(__LIBXS) + are_equal = .NOT. libxs_diff(array1%low%data, array2%low%data) #else IF (SIZE(array1%low%data) .NE. SIZE(array2%low%data)) RETURN are_equal = ALL(array1%low%data .EQ. array2%low%data) diff --git a/src/core/dbcsr_config.F b/src/core/dbcsr_config.F index b6d5ee53484..87a4b9030e8 100644 --- a/src/core/dbcsr_config.F +++ b/src/core/dbcsr_config.F @@ -55,7 +55,7 @@ MODULE dbcsr_config LOGICAL, PARAMETER :: has_smm_vec = .FALSE. #endif -#if defined(__LIBXSMM) +#if defined(__LIBXS) LOGICAL, PARAMETER :: has_xsmm = .TRUE. #else LOGICAL, PARAMETER :: has_xsmm = .FALSE. @@ -89,7 +89,7 @@ MODULE dbcsr_config LOGICAL, PARAMETER :: mm_dense_default = mm_dense_default_cpu #endif -#if defined(__LIBXSMM) +#if defined(__LIBXS) INTEGER, PARAMETER :: mm_default_driver = mm_driver_xsmm #elif defined (__HAS_smm_dnn) INTEGER, PARAMETER :: mm_default_driver = mm_driver_smm @@ -295,7 +295,7 @@ SUBROUTINE set_conf_par_mm_driver(this, mm_driver) IF (.NOT. has_smm) DBCSR_ABORT("Support for libsmm not compiled in.") this%val = mm_driver_smm ELSE IF (my_mm_driver .EQ. mm_name_xsmm) THEN - IF (.NOT. has_xsmm) DBCSR_ABORT("Support for libxsmm not compiled in.") + IF (.NOT. has_xsmm) DBCSR_ABORT("Support for LIBXS GEMM not compiled in.") this%val = mm_driver_xsmm ELSE DBCSR_ABORT("Unknown MM driver: "//TRIM(mm_driver)) diff --git a/src/core/dbcsr_lib.F b/src/core/dbcsr_lib.F index 3f0a44a7c41..49783295837 100644 --- a/src/core/dbcsr_lib.F +++ b/src/core/dbcsr_lib.F @@ -82,6 +82,22 @@ MODULE dbcsr_lib END INTERFACE #if defined (__DBCSR_ACC) + INTERFACE + FUNCTION libsmm_acc_init() RESULT(istat) & + BIND(C, name="libsmm_acc_init") + IMPORT :: C_INT + INTEGER(C_INT) :: istat + END FUNCTION libsmm_acc_init + END INTERFACE + + INTERFACE + FUNCTION libsmm_acc_finalize() RESULT(istat) & + BIND(C, name="libsmm_acc_finalize") + IMPORT :: C_INT + INTEGER(C_INT) :: istat + END FUNCTION libsmm_acc_finalize + END INTERFACE + INTERFACE FUNCTION libsmm_acc_is_thread_safe() & RESULT(thread_safe) & @@ -175,8 +191,8 @@ SUBROUTINE dbcsr_init_lib_pre(mp_comm, io_unit, accdrv_active_device_id) !! Initialize the DBCSR library !! Prepares the DBCSR library for use. -#if defined(__LIBXSMM) - USE libxsmm, ONLY: libxsmm_init +#if defined(__LIBXS) + USE LIBXS, ONLY: libxs_init #endif TYPE(mp_comm_type), INTENT(IN) :: mp_comm INTEGER, INTENT(IN), OPTIONAL :: io_unit, accdrv_active_device_id @@ -206,8 +222,8 @@ SUBROUTINE dbcsr_init_lib_pre(mp_comm, io_unit, accdrv_active_device_id) END IF CALL dbcsr_mp_make_env(mp_env, default_group, mp_comm) -#if defined(__LIBXSMM) - CALL libxsmm_init() +#if defined(__LIBXS) + CALL libxs_init() #endif ! Initialize Acc and set active device @@ -221,6 +237,10 @@ SUBROUTINE dbcsr_init_lib_pre(mp_comm, io_unit, accdrv_active_device_id) DBCSR_ABORT("dbcsr_init_lib: No recognized GPU devices") END IF CALL acc_init() +#if defined(__DBCSR_ACC) + IF (libsmm_acc_init() /= 0) & + DBCSR_ABORT("dbcsr_init_lib: libsmm_acc_init failed") +#endif END IF #if defined(__DBCSR_ACC) @@ -277,8 +297,8 @@ SUBROUTINE dbcsr_finalize_lib() !! Finalize the DBCSR library !! Cleans up after the DBCSR library. Used to deallocate persistent objects. -#if defined(__LIBXSMM) - USE libxsmm, ONLY: libxsmm_finalize +#if defined(__LIBXS) + USE LIBXS, ONLY: libxs_finalize #endif CHARACTER(len=*), PARAMETER :: routineN = 'dbcsr_finalize_lib' @@ -306,12 +326,16 @@ SUBROUTINE dbcsr_finalize_lib() NULLIFY (dbcsr_warn_hook) CALL dbcsr_mp_release(mp_env) CALL mp_comm_free(default_group) -#if defined(__LIBXSMM) - CALL libxsmm_finalize() +#if defined(__LIBXS) + CALL libxs_finalize() #endif ! Reset Acc ID CALL reset_accdrv_active_device_id() IF (use_acc()) THEN +#if defined(__DBCSR_ACC) + IF (libsmm_acc_finalize() /= 0) & + DBCSR_ABORT("dbcsr_finalize_lib: libsmm_acc_finalize failed") +#endif CALL acc_finalize() END IF diff --git a/src/mm/dbcsr_mm_hostdrv.F b/src/mm/dbcsr_mm_hostdrv.F index 99eee4e3641..2f3bd200c79 100644 --- a/src/mm/dbcsr_mm_hostdrv.F +++ b/src/mm/dbcsr_mm_hostdrv.F @@ -175,36 +175,21 @@ SUBROUTINE dbcsr_mm_hostdrv_process(this, left, right, params, stack_size, & CASE default DBCSR_ABORT("Invalid data type") END SELECT -#if defined(__LIBXSMM) +#if defined(__LIBXS) CASE (mm_driver_xsmm) SELECT CASE (this%data_area%d%data_type) -#if TO_VERSION(1, 10) < TO_VERSION(LIBXSMM_CONFIG_VERSION_MAJOR, LIBXSMM_CONFIG_VERSION_MINOR) - CASE (dbcsr_type_real_4) - CALL xsmm_process_mm_batch_s(stack_descr, params, stack_size, & - left%data_area%d%r_sp, right%data_area%d%r_sp, this%data_area%d%r_sp, used_smm) - CASE (dbcsr_type_real_8) - CALL xsmm_process_mm_batch_d(stack_descr, params, stack_size, & - left%data_area%d%r_dp, right%data_area%d%r_dp, this%data_area%d%r_dp, used_smm) - CASE (dbcsr_type_complex_4) - CALL xsmm_process_mm_batch_c(stack_descr, params, stack_size, & - left%data_area%d%c_sp, right%data_area%d%c_sp, this%data_area%d%c_sp, used_smm) - CASE (dbcsr_type_complex_8) - CALL xsmm_process_mm_batch_z(stack_descr, params, stack_size, & - left%data_area%d%c_dp, right%data_area%d%c_dp, this%data_area%d%c_dp, used_smm) -#else CASE (dbcsr_type_real_4) - CALL xsmm_process_mm_stack_s(stack_descr, params, stack_size, & - left%data_area%d%r_sp, right%data_area%d%r_sp, this%data_area%d%r_sp, used_smm) + CALL libxs_process_mm_stack_s(stack_descr, params, stack_size, & + left%data_area%d%r_sp, right%data_area%d%r_sp, this%data_area%d%r_sp, used_smm) CASE (dbcsr_type_real_8) - CALL xsmm_process_mm_stack_d(stack_descr, params, stack_size, & - left%data_area%d%r_dp, right%data_area%d%r_dp, this%data_area%d%r_dp, used_smm) + CALL libxs_process_mm_stack_d(stack_descr, params, stack_size, & + left%data_area%d%r_dp, right%data_area%d%r_dp, this%data_area%d%r_dp, used_smm) CASE (dbcsr_type_complex_4) - CALL xsmm_process_mm_stack_c(stack_descr, params, stack_size, & - left%data_area%d%c_sp, right%data_area%d%c_sp, this%data_area%d%c_sp, used_smm) + CALL libxs_process_mm_stack_c(stack_descr, params, stack_size, & + left%data_area%d%c_sp, right%data_area%d%c_sp, this%data_area%d%c_sp, used_smm) CASE (dbcsr_type_complex_8) - CALL xsmm_process_mm_stack_z(stack_descr, params, stack_size, & - left%data_area%d%c_dp, right%data_area%d%c_dp, this%data_area%d%c_dp, used_smm) -#endif + CALL libxs_process_mm_stack_z(stack_descr, params, stack_size, & + left%data_area%d%c_dp, right%data_area%d%c_dp, this%data_area%d%c_dp, used_smm) CASE default DBCSR_ABORT("Invalid data type") END SELECT @@ -382,205 +367,121 @@ SUBROUTINE smm_process_mm_stack_${nametype1}$ (stack_descr, params, & MARK_USED(stack_descr) END SUBROUTINE smm_process_mm_stack_${nametype1}$ -#if defined(__LIBXSMM) && TO_VERSION(1, 10) < TO_VERSION(LIBXSMM_CONFIG_VERSION_MAJOR, LIBXSMM_CONFIG_VERSION_MINOR) - SUBROUTINE xsmm_process_mm_batch_${nametype1}$ (stack_descr, params, & - stack_size, a_data, b_data, c_data, used_smm) - !! Processes MM stack and issues libxsmm calls -#if ${xsmm_supported[n]}$ -#if !defined(DBCSR_LIBXSMM_GEMM_BATCH) -#define DBCSR_LIBXSMM_GEMM_BATCH libxsmm_gemm_batch +#if defined(__LIBXS) + SUBROUTINE libxs_process_mm_stack_${nametype1}$ (stack_descr, params, & + stack_size, a_data, b_data, c_data, used_smm) + !! Processes MM stack using LIBXS indexed GEMM batch. + !! Real types use LIBXS dispatch; complex types fall through to BLAS. + #:if base1 == 'r' + USE LIBXS, ONLY: libxs_gemm_config_t, & + libxs_gemm_dispatch, libxs_gemm_index, & + C_LOC, C_SIZEOF, & + LIBXS_DATATYPE_F${bits1[n]}$ + USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_FUNLOC + #:set ckind1 = 'C_DOUBLE' if nametype1 == 'd' else 'C_FLOAT' +#if defined(__MKL) + INTERFACE + FUNCTION mkl_cblas_jit_create_${nametype1}$gemm(jitter, & + layout, transa, transb, m, n, k, & + alpha, lda, ldb, beta, ldc) & + RESULT(status) BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_PTR, C_INT, ${ckind1}$ + INTEGER(C_INT) :: status + TYPE(C_PTR) :: jitter + INTEGER(C_INT), VALUE :: layout, transa, transb + INTEGER(C_INT), VALUE :: m, n, k, lda, ldb, ldc + REAL(${ckind1}$), VALUE :: alpha, beta + END FUNCTION + FUNCTION mkl_jit_get_${nametype1}$gemm_ptr(jitter) & + RESULT(ptr) BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_FUNPTR, C_PTR + TYPE(C_FUNPTR) :: ptr + TYPE(C_PTR), INTENT(IN), VALUE :: jitter + END FUNCTION + END INTERFACE +#endif +#if defined(__LIBXSMM) + INTERFACE + FUNCTION libxsmm_dispatch_gemm(shape, flags, prefetch) & + RESULT(fn) BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_FUNPTR, C_INT + INTEGER(C_INT), INTENT(IN) :: shape(10) + INTEGER(C_INT), INTENT(IN), VALUE :: flags, prefetch + TYPE(C_FUNPTR) :: fn + END FUNCTION + END INTERFACE #endif - ! Caution: This dependency is ignored by makedep.py, because libxsmm.F is kinda empty. - USE libxsmm, ONLY: LIBXSMM_GEMM_PRECISION => ${'LIBXSMM_DATATYPE_F'+bits1[n]}$, & - libxsmm_gemm => libxsmm_${nametype1}$gemm, & - libxsmm_gemm_batch => DBCSR_LIBXSMM_GEMM_BATCH, & - libxsmm_ptr0 - REAL(${kind1}$), PARAMETER :: one = 1.0_${kind1}$ - INTEGER :: sp +#if defined(__BLAS) || defined(__MKL) + INTERFACE + SUBROUTINE ${nametype1}$gemm_blas(transa, transb, & + m, n, k, alpha, a, lda, b, ldb, beta, c, ldc) & + BIND(C, NAME="${nametype1}$gemm_") + USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_INT, C_CHAR, ${ckind1}$ + CHARACTER(1, C_CHAR), INTENT(IN) :: transa, transb + INTEGER(C_INT), INTENT(IN) :: m, n, k, lda, ldb, ldc + REAL(${ckind1}$), INTENT(IN) :: alpha, beta, a(*), b(*) + REAL(${ckind1}$), INTENT(INOUT) :: c(*) + END SUBROUTINE + END INTERFACE #endif + #:endif INTEGER, INTENT(IN) :: stack_size - !! Number of parameters TYPE(stack_descriptor_type), INTENT(IN) :: stack_descr INTEGER, DIMENSION(dbcsr_ps_width, 1:stack_size), & - INTENT(IN) :: params - !! Stack of MM parameters + INTENT(IN), TARGET :: params ${type1}$, DIMENSION(*), TARGET, INTENT(IN) :: a_data - !! Left-matrix data ${type1}$, DIMENSION(*), TARGET, INTENT(IN) :: b_data - !! Right-matrix data ${type1}$, DIMENSION(*), TARGET, INTENT(INOUT) :: c_data - !! Product data LOGICAL, INTENT(OUT) :: used_smm - !! Flag to signal if an efficient kernel was used - -#if ${xsmm_supported[n]}$ - IF (stack_descr%defined_mnk) THEN ! homogeneous stack - CALL libxsmm_gemm_batch(LIBXSMM_GEMM_PRECISION, LIBXSMM_GEMM_PRECISION, 'N', 'N', & - m=stack_descr%m, n=stack_descr%n, k=stack_descr%k, & - alpha=libxsmm_ptr0(one), a=libxsmm_ptr0(a_data(LBOUND(a_data, 1))), & - lda=stack_descr%m, & - b=libxsmm_ptr0(b_data(LBOUND(b_data, 1))), & - ldb=stack_descr%k, & - beta=libxsmm_ptr0(one), c=libxsmm_ptr0(c_data(LBOUND(c_data, 1))), & - ldc=stack_descr%m, index_base=1, & - index_stride=KIND(params)*dbcsr_ps_width, & - stride_a=libxsmm_ptr0(params(p_a_first, 1)), & - stride_b=libxsmm_ptr0(params(p_b_first, 1)), & - stride_c=libxsmm_ptr0(params(p_c_first, 1)), & - batchsize=stack_size) - used_smm = .TRUE. - ELSE ! Dispatch for every (different) matrix - DO sp = 1, stack_size - CALL libxsmm_gemm(m=params(p_m, sp), n=params(p_n, sp), k=params(p_k, sp), & - a=a_data(params(p_a_first, sp)), & - b=b_data(params(p_b_first, sp)), & - c=c_data(params(p_c_first, sp)), & - alpha=one, beta=one) - END DO - used_smm = .FALSE. - END IF -#else - MARK_USED(stack_descr) - ! We do not want to abort here, fall back to BLAS. - CALL blas_process_mm_stack_${nametype1}$ (params, stack_size, a_data, b_data, c_data) + + #:if base1 == 'r' + TYPE(libxs_gemm_config_t) :: config + INTEGER :: m, n, k, rc + #:endif + used_smm = .FALSE. + #:if base1 != 'r' + MARK_USED(stack_descr) + #:endif + #:if base1 == 'r' + IF (stack_descr%defined_mnk) THEN + m = stack_descr%m; n = stack_descr%n; k = stack_descr%k + rc = libxs_gemm_dispatch(config, & + datatype=LIBXS_DATATYPE_F${bits1[n]}$, & + transa='N', transb='N', & + m=m, n=n, k=k, lda=m, ldb=k, ldc=m, & + alpha=1D0, beta=1D0 & +#if defined(__MKL) + , jit_create_${nametype1}$gemm= & + C_FUNLOC(mkl_cblas_jit_create_${nametype1}$gemm) & + , jit_get_${nametype1}$gemm= & + C_FUNLOC(mkl_jit_get_${nametype1}$gemm_ptr) & #endif - END SUBROUTINE xsmm_process_mm_batch_${nametype1}$ +#if defined(__LIBXSMM) + , xgemm_dispatch= & + C_FUNLOC(libxsmm_dispatch_gemm) & #endif - -#if defined(__LIBXSMM) && TO_VERSION(1, 10) >= TO_VERSION(LIBXSMM_CONFIG_VERSION_MAJOR, LIBXSMM_CONFIG_VERSION_MINOR) - - SUBROUTINE xsmm_process_mm_stack_${nametype1}$ (stack_descr, params, & - stack_size, a_data, b_data, c_data, used_smm) - !! Processes MM stack and issues libxsmm calls -#if ${xsmm_supported[n]}$ - ! Caution: This dependency is ignored by makedep.py, because libxsmm.F is kinda empty. - USE libxsmm, ONLY: libxsmm_function => libxsmm_${nametype1}$mmfunction, & - libxsmm_dispatch => libxsmm_${nametype1}$mmdispatch, & - libxsmm_available => libxsmm_${nametype1}$mmavailable, & - libxsmm_call => libxsmm_${nametype1}$mmcall, & - libxsmm_gemm => libxsmm_${nametype1}$gemm, & - LIBXSMM_PREFETCH_NONE, & - LIBXSMM_PREFETCH, & - LIBXSMM_MAX_MNK, & - LIBXSMM_FLAGS - INTEGER, PARAMETER :: LIBXSMM_DEFAULT_PREFETCH = LIBXSMM_PREFETCH - INTEGER, PARAMETER :: LIBXSMM_DEFAULT_FLAGS = LIBXSMM_FLAGS - REAL(${kind1}$), PARAMETER :: one = 1.0_${kind1}$ - REAL(${kind1}$), DIMENSION(:, :), POINTER :: a_ptr, b_ptr, c_ptr - INTEGER :: m, n, k, sp, fa, fb, fc - LOGICAL :: processed - TYPE(libxsmm_function) :: func - INTEGER(int_8) :: threshold - INTEGER :: pa, pb, pc +#if defined(__BLAS) || defined(__MKL) + , ${nametype1}$gemm_blas= & + C_FUNLOC(${nametype1}$gemm_blas) & #endif - INTEGER, INTENT(IN) :: stack_size - !! Number of parameters - TYPE(stack_descriptor_type), INTENT(IN) :: stack_descr - INTEGER, DIMENSION(dbcsr_ps_width, 1:stack_size), & - INTENT(IN) :: params - !! Stack of MM parameters - ${type1}$, DIMENSION(*), TARGET, INTENT(IN) :: a_data - !! Left-matrix data - ${type1}$, DIMENSION(*), TARGET, INTENT(IN) :: b_data - !! Right-matrix data - ${type1}$, DIMENSION(*), TARGET, INTENT(INOUT) :: c_data - !! Product data - LOGICAL, INTENT(OUT) :: used_smm - !! Flag to signal if an efficient kernel was used - -#if ${xsmm_supported[n]}$ - processed = .FALSE. - used_smm = .FALSE. - - ! check whether the matrix stack is homogeneous or not - IF (stack_descr%defined_mnk) THEN - threshold = INT(stack_descr%m, int_8)* & - INT(stack_descr%n, int_8)* & - INT(stack_descr%k, int_8) - - ! check if matrices are too large for LIBXSMM (BLAS is likely more efficient) - IF (threshold <= LIBXSMM_MAX_MNK) THEN - ! try to get a function pointer from libxsmm - CALL libxsmm_dispatch(func, & - m=stack_descr%m, n=stack_descr%n, k=stack_descr%k, alpha=one, beta=one, & - flags=LIBXSMM_DEFAULT_FLAGS, prefetch=LIBXSMM_DEFAULT_PREFETCH) - - IF (libxsmm_available(func)) THEN - ! load first stack entry - DBCSR_ASSERT(stack_size > 0) - pa = params(p_a_first, 1) - pb = params(p_b_first, 1) - pc = params(p_c_first, 1) - - DO sp = 1, stack_size - 1 - fa = pa; fb = pb; fc = pc - ! prefetch next blocks - pa = params(p_a_first, sp + 1) - pb = params(p_b_first, sp + 1) - pc = params(p_c_first, sp + 1) - - ! condition evaluates at compile-time (PARAMETER) - IF (LIBXSMM_DEFAULT_PREFETCH /= LIBXSMM_PREFETCH_NONE) THEN - CALL libxsmm_call(func, & - a=a_data(fa), b=b_data(fb), c=c_data(fc), & - ! provide locations of the next operand set - pa=a_data(pa), pb=b_data(pb), pc=c_data(pc)) - ELSE - CALL libxsmm_call(func, & - a=a_data(fa), b=b_data(fb), c=c_data(fc)) - END IF - END DO - - ! handle last stack entry without out-of-bounds access - fa = pa; fb = pb; fc = pc - - ! condition evaluates at compile-time (PARAMETER) - IF (LIBXSMM_DEFAULT_PREFETCH /= LIBXSMM_PREFETCH_NONE) THEN - CALL libxsmm_call(func, & - a=a_data(fa), b=b_data(fb), c=c_data(fc), & - ! prefetch same blocks - pa=a_data(pa), pb=b_data(pb), pc=c_data(pc)) - ELSE - CALL libxsmm_call(func, & - a=a_data(fa), b=b_data(fb), c=c_data(fc)) - END IF - - processed = .TRUE. + ) + IF (0 /= rc) THEN + CALL libxs_gemm_index( & + C_LOC(a_data), C_LOC(params(p_a_first, 1)), & + C_LOC(b_data), C_LOC(params(p_b_first, 1)), & + C_LOC(c_data), C_LOC(params(p_c_first, 1)), & + INT(C_SIZEOF(params(1, 1)))*dbcsr_ps_width, 1, & + stack_size, config) used_smm = .TRUE. END IF - ELSE - CALL blas_process_mm_stack_${nametype1}$ (params, stack_size, a_data, b_data, c_data) - processed = .TRUE. END IF + #:endif + IF (.NOT. used_smm) THEN + CALL blas_process_mm_stack_${nametype1}$ (params, stack_size, & + a_data, b_data, c_data) END IF - - IF (.NOT. processed) THEN - ! Dispatch interface was not used, call regular interface. - ! Should only happen for inhomogeneous stacks. - ! Counted as used_smm = .FALSE. - DO sp = 1, stack_size - m = params(p_m, sp) - n = params(p_n, sp) - k = params(p_k, sp) - fa = params(p_a_first, sp) - fb = params(p_b_first, sp) - fc = params(p_c_first, sp) - ! somewhat expensive pointer remapping required - a_ptr(1:m, 1:k) => a_data(fa:fa + (m*k)) - b_ptr(1:k, 1:n) => b_data(fb:fb + (k*n)) - c_ptr(1:m, 1:n) => c_data(fc:fc + (m*n)) - CALL libxsmm_gemm(m=m, n=n, k=k, a=a_ptr, b=b_ptr, c=c_ptr, & - alpha=one, beta=one) - END DO - END IF -#else - MARK_USED(stack_descr) - ! We do not want to abort here, fall back to BLAS. - CALL blas_process_mm_stack_${nametype1}$ (params, stack_size, a_data, b_data, c_data) - used_smm = .FALSE. -#endif - END SUBROUTINE xsmm_process_mm_stack_${nametype1}$ + END SUBROUTINE libxs_process_mm_stack_${nametype1}$ #endif PURE SUBROUTINE internal_mm_${nametype1}$_nn( & diff --git a/src/tas/dbcsr_tas_util.F b/src/tas/dbcsr_tas_util.F index 5379bf304ff..7924e8c5a3b 100644 --- a/src/tas/dbcsr_tas_util.F +++ b/src/tas/dbcsr_tas_util.F @@ -21,8 +21,8 @@ MODULE dbcsr_tas_util USE dbcsr_index_operations, ONLY: dbcsr_sort_indices #include "base/dbcsr_base_uses.f90" -#if TO_VERSION(1, 11) <= TO_VERSION(LIBXSMM_CONFIG_VERSION_MAJOR, LIBXSMM_CONFIG_VERSION_MINOR) - USE libxsmm, ONLY: libxsmm_diff +#if defined(__LIBXS) + USE LIBXS, ONLY: libxs_diff # define PURE_ARRAY_EQ #else # define PURE_ARRAY_EQ PURE @@ -138,8 +138,8 @@ SUBROUTINE invert_transpose_flag(trans_flag) PURE_ARRAY_EQ FUNCTION array_eq_i(arr1, arr2) INTEGER, DIMENSION(:), INTENT(IN) :: arr1, arr2 LOGICAL :: array_eq_i -#if TO_VERSION(1, 11) <= TO_VERSION(LIBXSMM_CONFIG_VERSION_MAJOR, LIBXSMM_CONFIG_VERSION_MINOR) - array_eq_i = .NOT. libxsmm_diff(arr1, arr2) +#if defined(__LIBXS) + array_eq_i = .NOT. libxs_diff(arr1, arr2) #else array_eq_i = .FALSE. IF (SIZE(arr1) .EQ. SIZE(arr2)) array_eq_i = ALL(arr1 == arr2) @@ -149,8 +149,8 @@ PURE_ARRAY_EQ FUNCTION array_eq_i(arr1, arr2) PURE_ARRAY_EQ FUNCTION array_eq_i8(arr1, arr2) INTEGER(KIND=int_8), DIMENSION(:), INTENT(IN) :: arr1, arr2 LOGICAL :: array_eq_i8 -#if TO_VERSION(1, 11) <= TO_VERSION(LIBXSMM_CONFIG_VERSION_MAJOR, LIBXSMM_CONFIG_VERSION_MINOR) - array_eq_i8 = .NOT. libxsmm_diff(arr1, arr2) +#if defined(__LIBXS) + array_eq_i8 = .NOT. libxs_diff(arr1, arr2) #else array_eq_i8 = .FALSE. IF (SIZE(arr1) .EQ. SIZE(arr2)) array_eq_i8 = ALL(arr1 == arr2) diff --git a/src/tensors/dbcsr_array_list_methods.F b/src/tensors/dbcsr_array_list_methods.F index 1077e172488..dcb5a054c86 100644 --- a/src/tensors/dbcsr_array_list_methods.F +++ b/src/tensors/dbcsr_array_list_methods.F @@ -19,8 +19,8 @@ MODULE dbcsr_array_list_methods USE dbcsr_allocate_wrap, ONLY: allocate_any #include "base/dbcsr_base_uses.f90" -#if TO_VERSION(1, 11) <= TO_VERSION(LIBXSMM_CONFIG_VERSION_MAJOR, LIBXSMM_CONFIG_VERSION_MINOR) - USE libxsmm, ONLY: libxsmm_diff +#if defined(__LIBXS) + USE LIBXS, ONLY: libxs_diff # define PURE_ARRAY_EQ #else # define PURE_ARRAY_EQ PURE @@ -288,8 +288,8 @@ PURE_ARRAY_EQ FUNCTION array_eq_i(arr1, arr2) INTEGER, INTENT(IN), DIMENSION(:) :: arr2 LOGICAL :: array_eq_i -#if TO_VERSION(1, 11) <= TO_VERSION(LIBXSMM_CONFIG_VERSION_MAJOR, LIBXSMM_CONFIG_VERSION_MINOR) - array_eq_i = .NOT. libxsmm_diff(arr1, arr2) +#if defined(__LIBXS) + array_eq_i = .NOT. libxs_diff(arr1, arr2) #else array_eq_i = .FALSE. IF (SIZE(arr1) .EQ. SIZE(arr2)) array_eq_i = ALL(arr1 == arr2) diff --git a/src/utils/dbcsr_toollib.F b/src/utils/dbcsr_toollib.F index e084f683819..233b98a7c37 100644 --- a/src/utils/dbcsr_toollib.F +++ b/src/utils/dbcsr_toollib.F @@ -164,14 +164,12 @@ FUNCTION joaat_hash(key) RESULT(hash_index) !! we compute it using an integer with the appropriate range !! we return already the index in the table as a final result - ! LIBXSMM: at least v1.9.0-6 is required -#if defined(__LIBXSMM) && TO_VERSION(1, 10) <= TO_VERSION(LIBXSMM_CONFIG_VERSION_MAJOR, LIBXSMM_CONFIG_VERSION_MINOR) - USE libxsmm, ONLY: libxsmm_hash - INTEGER, PARAMETER :: seed = 0 +#if defined(__LIBXS) + USE LIBXS, ONLY: libxs_hash INTEGER, DIMENSION(:), INTENT(IN) :: key !! a string of any length INTEGER :: hash_index - hash_index = libxsmm_hash(key, seed) + hash_index = libxs_hash(key) #else INTEGER, DIMENSION(:), INTENT(IN) :: key INTEGER :: hash_index diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index a35971c5125..604edef1cc9 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -74,7 +74,10 @@ set(DBCSR_TESTS_FTN dbcsr_test_csr_conversions) if (USE_ACCEL) - set(DBCSR_TESTS_BACKEND dbcsr_acc_test acc_bench) + set(DBCSR_TESTS_BACKEND dbcsr_acc_test) + if (LIBXS_LIBRARY OR LIBXS_FETCHED) + list(APPEND DBCSR_TESTS_BACKEND acc_bench) + endif () endif () if (NOT (CMAKE_Fortran_COMPILER_ID STREQUAL "Cray")) @@ -185,6 +188,20 @@ if (NOT USE_MPI) add_executable(${dbcsr_test_backend} ${${dbcsr_test_backend}_SRCS}) # tests may not need to link dbcsr but there is no separate dbcsr_acc target_link_libraries(${dbcsr_test_backend} PRIVATE dbcsr) + if (BLAS_LIBRARIES MATCHES "mkl_") + target_compile_definitions(${dbcsr_test_backend} PRIVATE __MKL) + endif () + if (LIBXS_FETCHED) + target_link_libraries(${dbcsr_test_backend} PRIVATE libxs::libxs) + elseif (LIBXS_LIBRARY) + target_include_directories(${dbcsr_test_backend} + PRIVATE "${LIBXSROOT}/include") + endif () + if (LIBXSMM_LIBRARY) + target_compile_definitions(${dbcsr_test_backend} PRIVATE __LIBXSMM) + target_include_directories(${dbcsr_test_backend} + PRIVATE "${LIBXSMMROOT}/include") + endif () # register unittest executable with CMake add_test(NAME ${dbcsr_test_backend} COMMAND ./${dbcsr_test_backend}) set_tests_properties( diff --git a/tools/build_utils/fypp b/tools/build_utils/fypp index 724fb01fc95..963642111e2 160000 --- a/tools/build_utils/fypp +++ b/tools/build_utils/fypp @@ -1 +1 @@ -Subproject commit 724fb01fc95a183ba9b63747abba1176e9f95463 +Subproject commit 963642111e2b893c1a52fa227b259e36c95a7fb5 diff --git a/tools/docker/Dockerfile.build-env-ubuntu b/tools/docker/Dockerfile.build-env-ubuntu index 0ace1bd728a..044fb17e8f2 100644 --- a/tools/docker/Dockerfile.build-env-ubuntu +++ b/tools/docker/Dockerfile.build-env-ubuntu @@ -55,14 +55,26 @@ RUN set -ex ; \ git-archive-all \ ; -ARG libxsmm_version=488aa88f2a9825e9f92a0cfc773c1aedf019f88a +ENV PKG_CONFIG_PATH="/opt/libxstream/lib/pkgconfig:/opt/libxs/lib/pkgconfig:${PKG_CONFIG_PATH}" RUN set -ex ; \ - curl -LsS https://github.com/libxsmm/libxsmm/archive/${libxsmm_version}.tar.gz | tar -xz -C /opt ; \ - ln -s libxsmm-${libxsmm_version} /opt/libxsmm ; \ - make -j -C /opt/libxsmm WRAP=0 + apt-get update ; \ + apt-get install -y --no-install-recommends opencl-c-headers ocl-icd-libopencl1 ; \ + rm -rf /var/lib/apt/lists/* + +ARG libxstream_version=87bbd69f0cdf6ca23801923ee201f960fb37860f + +RUN set -ex ; \ + curl -LsS https://github.com/hfp/libxstream/archive/${libxstream_version}.tar.gz | tar -xz -C /opt ; \ + ln -s libxstream-${libxstream_version} /opt/libxstream ; \ + make -j -C /opt/libxstream + +ARG libxs_version=1d776c091fb41d4aa7bc92335f6387878e1a9db6 -ENV PKG_CONFIG_PATH="/opt/libxsmm/lib:${PKG_CONFIG_PATH}" +RUN set -ex ; \ + curl -LsS https://github.com/hfp/libxs/archive/${libxs_version}.tar.gz | tar -xz -C /opt ; \ + ln -s libxs-${libxs_version} /opt/libxs ; \ + make -j -C /opt/libxs # Remove LTO for MPICH (default now in Ubuntu >=22) RUN set -ex ; \ diff --git a/tools/docker/Dockerfile.build-env-ubuntu-cuda b/tools/docker/Dockerfile.build-env-ubuntu-cuda index 5dadec16251..31ec2de6fbf 100644 --- a/tools/docker/Dockerfile.build-env-ubuntu-cuda +++ b/tools/docker/Dockerfile.build-env-ubuntu-cuda @@ -46,14 +46,26 @@ RUN set -ex ; \ git-archive-all \ ; -ARG libxsmm_version=488aa88f2a9825e9f92a0cfc773c1aedf019f88a +ENV PKG_CONFIG_PATH="/opt/libxstream/lib/pkgconfig:/opt/libxs/lib/pkgconfig:${PKG_CONFIG_PATH}" RUN set -ex ; \ - curl -LsS https://github.com/libxsmm/libxsmm/archive/${libxsmm_version}.tar.gz | tar -xz -C /opt ; \ - ln -s libxsmm-${libxsmm_version} /opt/libxsmm ; \ - make -j -C /opt/libxsmm WRAP=0 + apt-get update ; \ + apt-get install -y --no-install-recommends opencl-c-headers ocl-icd-libopencl1 ; \ + rm -rf /var/lib/apt/lists/* + +ARG libxstream_version=87bbd69f0cdf6ca23801923ee201f960fb37860f + +RUN set -ex ; \ + curl -LsS https://github.com/hfp/libxstream/archive/${libxstream_version}.tar.gz | tar -xz -C /opt ; \ + ln -s libxstream-${libxstream_version} /opt/libxstream ; \ + make -j -C /opt/libxstream + +ARG libxs_version=1d776c091fb41d4aa7bc92335f6387878e1a9db6 -ENV PKG_CONFIG_PATH="/opt/libxsmm/lib:${PKG_CONFIG_PATH}" +RUN set -ex ; \ + curl -LsS https://github.com/hfp/libxs/archive/${libxs_version}.tar.gz | tar -xz -C /opt ; \ + ln -s libxs-${libxs_version} /opt/libxs ; \ + make -j -C /opt/libxs # Leak suppression COPY lsan.supp /opt