diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1d388d9e..ae6c4ce9 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -223,9 +223,12 @@ jobs: - arch: Win32 obzip: https://github.com/OpenMathLib/OpenBLAS/releases/download/v0.3.25/OpenBLAS-0.3.25-x86.zip s2arc: x86 + clblast: OFF - arch: x64 obzip: https://github.com/OpenMathLib/OpenBLAS/releases/download/v0.3.25/OpenBLAS-0.3.25-x64.zip s2arc: x64 + clblast: ON + clver: 1.6.1 - sdl2: ON s2ver: 2.28.5 @@ -252,6 +255,18 @@ jobs: 7z x sdl2.zip echo "SDL2_DIR=$env:GITHUB_WORKSPACE/SDL2-${{ matrix.s2ver }}/cmake" >> $env:GITHUB_ENV + - name: Install OpenCL + if: matrix.clblast == 'ON' + run: vcpkg.exe --triplet=${{ matrix.arch }}-windows install opencl + + - name: Fetch CLBlast and set CLBlast_DIR + if: matrix.clblast == 'ON' + run: | + C:/msys64/usr/bin/wget.exe -qO clblast.zip https://github.com/CNugteren/CLBlast/releases/download/${{ matrix.clver }}/CLBlast-${{ matrix.clver }}-windows-x64.zip + 7z x clblast.zip + 7z x CLBlast-${{ matrix.clver }}-windows-x64.7z + echo "CLBlast_DIR=$env:GITHUB_WORKSPACE/CLBlast-${{ matrix.clver }}-windows-x64/lib/cmake/CLBlast" >> $env:GITHUB_ENV + - name: Configure run: > cmake -S . -B ./build -A ${{ matrix.arch }} @@ -259,6 +274,7 @@ jobs: -DWHISPER_OPENBLAS=${{ matrix.blas }} -DCMAKE_LIBRARY_PATH="$env:OPENBLAS_PATH/lib" -DWHISPER_SDL2=${{ matrix.sdl2 }} + -DWHISPER_CLBLAST=${{ matrix.clblast }} - name: Build run: | @@ -273,11 +289,15 @@ jobs: if: matrix.sdl2 == 'ON' run: copy "$env:SDL2_DIR/../lib/${{ matrix.s2arc }}/SDL2.dll" build/bin/${{ matrix.build }} + - name: Copy clblast.dll + if: matrix.clblast == 'ON' + run: copy "$env:CLBlast_DIR/../../clblast.dll" build/bin/${{ matrix.build }} + - name: Upload binaries if: matrix.blas == 'ON' && matrix.sdl2 == 'ON' uses: actions/upload-artifact@v1 with: - name: whisper-blas-bin-${{ matrix.arch }} + name: whisper-blas${{ matrix.clblast == 'ON' && '-clblast' || ''}}-bin-${{ matrix.arch }} path: build/bin/${{ matrix.build }} windows-cublas: diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index e6f837f3..62b5b6fe 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -14,6 +14,10 @@ if (WHISPER_SDL2) message(STATUS "SDL2_LIBRARIES = ${SDL2_LIBRARIES}") endif() +if (WHISPER_CLBLAST) + find_package(CLBlast REQUIRED) +endif() + # common set(TARGET common) diff --git a/examples/talk-llama/CMakeLists.txt b/examples/talk-llama/CMakeLists.txt index e2130a40..567db344 100644 --- a/examples/talk-llama/CMakeLists.txt +++ b/examples/talk-llama/CMakeLists.txt @@ -3,7 +3,11 @@ if (WHISPER_SDL2) set(TARGET talk-llama) add_executable(${TARGET} talk-llama.cpp llama.cpp) target_include_directories(${TARGET} PRIVATE ${SDL2_INCLUDE_DIRS}) - target_link_libraries(${TARGET} PRIVATE common common-sdl whisper ${SDL2_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT}) + + if (WHISPER_CLBLAST) + set(CLBLAST_LIBNAME clblast) + endif () + target_link_libraries(${TARGET} PRIVATE common common-sdl whisper ${SDL2_LIBRARIES} ${CLBLAST_LIBNAME} ${CMAKE_THREAD_LIBS_INIT}) if(WIN32) # It requires Windows 8.1 or later for PrefetchVirtualMemory diff --git a/ggml-opencl.h b/ggml-opencl.h index a92b445c..44d05bd6 100644 --- a/ggml-opencl.h +++ b/ggml-opencl.h @@ -6,19 +6,19 @@ extern "C" { #endif -void ggml_cl_init(void); +GGML_API void ggml_cl_init(void); -void ggml_cl_mul(const struct ggml_tensor * src0, const struct ggml_tensor * src1, struct ggml_tensor * dst); -bool ggml_cl_can_mul_mat(const struct ggml_tensor * src0, const struct ggml_tensor * src1, struct ggml_tensor * dst); -size_t ggml_cl_mul_mat_get_wsize(const struct ggml_tensor * src0, const struct ggml_tensor * src1, struct ggml_tensor * dst); -void ggml_cl_mul_mat(const struct ggml_tensor * src0, const struct ggml_tensor * src1, struct ggml_tensor * dst, void * wdata, size_t wsize); +GGML_API void ggml_cl_mul(const struct ggml_tensor * src0, const struct ggml_tensor * src1, struct ggml_tensor * dst); +GGML_API bool ggml_cl_can_mul_mat(const struct ggml_tensor * src0, const struct ggml_tensor * src1, struct ggml_tensor * dst); +GGML_API size_t ggml_cl_mul_mat_get_wsize(const struct ggml_tensor * src0, const struct ggml_tensor * src1, struct ggml_tensor * dst); +GGML_API void ggml_cl_mul_mat(const struct ggml_tensor * src0, const struct ggml_tensor * src1, struct ggml_tensor * dst, void * wdata, size_t wsize); -void * ggml_cl_host_malloc(size_t size); -void ggml_cl_host_free(void * ptr); +GGML_API void * ggml_cl_host_malloc(size_t size); +GGML_API void ggml_cl_host_free(void * ptr); -void ggml_cl_free_data(const struct ggml_tensor* tensor); +GGML_API void ggml_cl_free_data(const struct ggml_tensor* tensor); -void ggml_cl_transform_tensor(void * data, struct ggml_tensor * tensor); +GGML_API void ggml_cl_transform_tensor(void * data, struct ggml_tensor * tensor); #ifdef __cplusplus }