Skip to content

Commit 08bd561

Browse files
bandotiarthw
authored andcommitted
vulkan : cmake integration (ggml-org#8119)
* Add Vulkan to CMake pkg * Add Sycl to CMake pkg * Add OpenMP to CMake pkg * Split generated shader file into separate translation unit * Add CMake target for Vulkan shaders * Update README.md * Add make target for Vulkan shaders * Use pkg-config to locate vulkan library * Add vulkan SDK dep to ubuntu-22-cmake-vulkan workflow * Clean up tabs * Move sudo to apt-key invocation * Forward GGML_EXTRA_LIBS to CMake config pkg * Update vulkan obj file paths * Add shaderc to nix pkg * Add python3 to Vulkan nix build * Link against ggml in cmake pkg * Remove Python dependency from Vulkan build * code review changes * Remove trailing newline * Add cflags from pkg-config to fix w64devkit build * Update README.md * Remove trailing whitespace * Update README.md * Remove trailing whitespace * Fix doc heading * Make glslc required Vulkan component * remove clblast from nix pkg
1 parent 2aa6717 commit 08bd561

File tree

12 files changed

+674
-145192
lines changed

12 files changed

+674
-145192
lines changed

.devops/nix/package.nix

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
vulkan-headers,
1919
vulkan-loader,
2020
curl,
21+
shaderc,
2122
useBlas ? builtins.all (x: !x) [
2223
useCuda
2324
useMetalKit
@@ -146,6 +147,7 @@ let
146147
vulkanBuildInputs = [
147148
vulkan-headers
148149
vulkan-loader
150+
shaderc
149151
];
150152
in
151153

.github/workflows/build.yml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -355,8 +355,10 @@ jobs:
355355
- name: Dependencies
356356
id: depends
357357
run: |
358-
sudo apt-get update
359-
sudo apt-get install build-essential libvulkan-dev
358+
wget -qO - https://packages.lunarg.com/lunarg-signing-key-pub.asc | sudo apt-key add -
359+
sudo wget -qO /etc/apt/sources.list.d/lunarg-vulkan-jammy.list https://packages.lunarg.com/vulkan/lunarg-vulkan-jammy.list
360+
sudo apt-get update -y
361+
sudo apt-get install -y build-essential vulkan-sdk
360362
361363
- name: Build
362364
id: cmake_build

CMakeLists.txt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,16 @@ set(LLAMA_INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_INCLUDEDIR} CACHE PATH "Location o
132132
set(LLAMA_LIB_INSTALL_DIR ${CMAKE_INSTALL_LIBDIR} CACHE PATH "Location of library files")
133133
set(LLAMA_BIN_INSTALL_DIR ${CMAKE_INSTALL_BINDIR} CACHE PATH "Location of binary files")
134134

135-
get_directory_property(LLAMA_TRANSIENT_DEFINES COMPILE_DEFINITIONS)
135+
136+
# At the moment some compile definitions are placed within the ggml/src
137+
# directory but not exported on the `ggml` target. This could be improved by
138+
# determining _precisely_ which defines are necessary for the llama-config
139+
# package.
140+
#
141+
get_directory_property(GGML_DIR_DEFINES DIRECTORY ggml/src COMPILE_DEFINITIONS)
142+
get_target_property(GGML_TARGET_DEFINES ggml COMPILE_DEFINITIONS)
143+
set(GGML_TRANSIENT_DEFINES ${GGML_TARGET_DEFINES} ${GGML_DIR_DEFINES})
144+
get_target_property(GGML_LINK_LIBRARIES ggml LINK_LIBRARIES)
136145

137146
set_target_properties(llama PROPERTIES PUBLIC_HEADER ${CMAKE_CURRENT_SOURCE_DIR}/include/llama.h)
138147
install(TARGETS llama LIBRARY PUBLIC_HEADER)

Makefile

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,10 @@ ifdef GGML_RPC
197197
BUILD_TARGETS += rpc-server
198198
endif
199199

200+
ifdef GGML_VULKAN
201+
BUILD_TARGETS += vulkan-shaders-gen
202+
endif
203+
200204
default: $(BUILD_TARGETS) $(LEGACY_TARGETS_BUILD)
201205

202206
test: $(TEST_TARGETS)
@@ -710,8 +714,8 @@ endif # GGML_CUDA
710714

711715
ifdef GGML_VULKAN
712716
MK_CPPFLAGS += -DGGML_USE_VULKAN
713-
MK_LDFLAGS += -lvulkan
714-
OBJ_GGML += ggml/src/ggml-vulkan.o
717+
MK_LDFLAGS += $(shell pkg-config --libs vulkan)
718+
OBJ_GGML += ggml/src/ggml-vulkan.o ggml/src/ggml-vulkan-shaders.o
715719

716720
ifdef GGML_VULKAN_CHECK_RESULTS
717721
MK_CPPFLAGS += -DGGML_VULKAN_CHECK_RESULTS
@@ -733,10 +737,28 @@ ifdef GGML_VULKAN_RUN_TESTS
733737
MK_CPPFLAGS += -DGGML_VULKAN_RUN_TESTS
734738
endif
735739

736-
ggml/src/ggml-vulkan.o: \
737-
ggml/src/ggml-vulkan.cpp \
738-
ggml/include/ggml-vulkan.h
739-
$(CXX) $(CXXFLAGS) -c $< -o $@
740+
GLSLC_CMD = glslc
741+
_ggml_vk_genshaders_cmd = $(shell pwd)/vulkan-shaders-gen
742+
_ggml_vk_header = ggml/src/ggml-vulkan-shaders.hpp
743+
_ggml_vk_source = ggml/src/ggml-vulkan-shaders.cpp
744+
_ggml_vk_input_dir = ggml/src/vulkan-shaders
745+
_ggml_vk_shader_deps = $(echo $(_ggml_vk_input_dir)/*.comp)
746+
747+
ggml/src/ggml-vulkan.o: ggml/src/ggml-vulkan.cpp ggml/include/ggml-vulkan.h $(_ggml_vk_header) $(_ggml_vk_source)
748+
$(CXX) $(CXXFLAGS) $(shell pkg-config --cflags vulkan) -c $< -o $@
749+
750+
$(_ggml_vk_header): $(_ggml_vk_source)
751+
752+
$(_ggml_vk_source): $(_ggml_vk_shader_deps) vulkan-shaders-gen
753+
$(_ggml_vk_genshaders_cmd) \
754+
--glslc $(GLSLC_CMD) \
755+
--input-dir $(_ggml_vk_input_dir) \
756+
--target-hpp $(_ggml_vk_header) \
757+
--target-cpp $(_ggml_vk_source)
758+
759+
vulkan-shaders-gen: ggml/src/vulkan-shaders/vulkan-shaders-gen.cpp
760+
$(CXX) $(CXXFLAGS) -o $@ $(LDFLAGS) ggml/src/vulkan-shaders/vulkan-shaders-gen.cpp
761+
740762
endif # GGML_VULKAN
741763

742764
ifdef GGML_HIPBLAS
@@ -1116,6 +1138,7 @@ clean:
11161138
rm -vrf ggml/src/ggml-cuda/template-instances/*.o
11171139
rm -rvf $(BUILD_TARGETS)
11181140
rm -rvf $(TEST_TARGETS)
1141+
rm -f vulkan-shaders-gen ggml/src/ggml-vulkan-shaders.hpp ggml/src/ggml-vulkan-shaders.cpp
11191142
rm -rvf $(LEGACY_TARGETS_CLEAN)
11201143
find examples pocs -type f -name "*.o" -delete
11211144

cmake/llama-config.cmake.in

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,13 @@ set(GGML_CUDA @GGML_CUDA@)
88
set(GGML_METAL @GGML_METAL@)
99
set(GGML_HIPBLAS @GGML_HIPBLAS@)
1010
set(GGML_ACCELERATE @GGML_ACCELERATE@)
11+
set(GGML_VULKAN @GGML_VULKAN@)
12+
set(GGML_VULKAN_CHECK_RESULTS @GGML_VULKAN_CHECK_RESULTS@)
13+
set(GGML_VULKAN_DEBUG @GGML_VULKAN_DEBUG@)
14+
set(GGML_VULKAN_MEMORY_DEBUG @GGML_VULKAN_MEMORY_DEBUG@)
15+
set(GGML_VULKAN_VALIDATE @GGML_VULKAN_VALIDATE@)
16+
set(GGML_SYCL @GGML_SYCL@)
17+
set(GGML_OPENMP @GGML_OPENMP@)
1118

1219
@PACKAGE_INIT@
1320

@@ -37,18 +44,36 @@ if (GGML_METAL)
3744
find_library(METALKIT_FRAMEWORK MetalKit REQUIRED)
3845
endif()
3946

47+
if (GGML_VULKAN)
48+
find_package(Vulkan REQUIRED)
49+
endif()
50+
4051
if (GGML_HIPBLAS)
4152
find_package(hip REQUIRED)
4253
find_package(hipblas REQUIRED)
4354
find_package(rocblas REQUIRED)
4455
endif()
4556

57+
if (GGML_SYCL)
58+
find_package(IntelSYCL REQUIRED)
59+
find_package(MKL REQUIRED)
60+
endif()
61+
62+
if (GGML_OPENMP)
63+
find_package(OpenMP REQUIRED)
64+
endif()
65+
66+
67+
find_library(ggml_LIBRARY ggml
68+
REQUIRED
69+
HINTS ${LLAMA_LIB_DIR})
70+
4671
find_library(llama_LIBRARY llama
4772
REQUIRED
4873
HINTS ${LLAMA_LIB_DIR})
4974

50-
set(_llama_link_deps "Threads::Threads" "@LLAMA_EXTRA_LIBS@")
51-
set(_llama_transient_defines "@LLAMA_TRANSIENT_DEFINES@")
75+
set(_llama_link_deps "${ggml_LIBRARY}" "@GGML_LINK_LIBRARIES@")
76+
set(_llama_transient_defines "@GGML_TRANSIENT_DEFINES@")
5277

5378
add_library(llama UNKNOWN IMPORTED)
5479

docs/build.md

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,45 @@ The following compilation options are also available to tweak performance (yes,
242242

243243
### Vulkan
244244

245+
**Windows**
246+
247+
#### w64devkit
248+
249+
Download and extract [w64devkit](https://github.com/skeeto/w64devkit/releases).
250+
251+
Download and install the [Vulkan SDK](https://vulkan.lunarg.com/sdk/home#windows). When selecting components, only the Vulkan SDK Core is required.
252+
253+
Launch `w64devkit.exe` and run the following commands to copy Vulkan dependencies:
254+
```sh
255+
SDK_VERSION=1.3.283.0
256+
cp /VulkanSDK/$SDK_VERSION/Bin/glslc.exe $W64DEVKIT_HOME/bin/
257+
cp /VulkanSDK/$SDK_VERSION/Lib/vulkan-1.lib $W64DEVKIT_HOME/x86_64-w64-mingw32/lib/
258+
cp -r /VulkanSDK/$SDK_VERSION/Include/* $W64DEVKIT_HOME/x86_64-w64-mingw32/include/
259+
cat > $W64DEVKIT_HOME/x86_64-w64-mingw32/lib/pkgconfig/vulkan.pc <<EOF
260+
Name: Vulkan-Loader
261+
Description: Vulkan Loader
262+
Version: $SDK_VERSION
263+
Libs: -lvulkan-1
264+
EOF
265+
266+
```
267+
Switch into the `llama.cpp` directory and run `make GGML_VULKAN=1`.
268+
269+
#### MSYS2
270+
Install [MSYS2](https://www.msys2.org/) and then run the following commands in a UCRT terminal to install dependencies.
271+
```sh
272+
pacman -S git \
273+
mingw-w64-ucrt-x86_64-gcc \
274+
mingw-w64-ucrt-x86_64-cmake \
275+
mingw-w64-ucrt-x86_64-vulkan-devel \
276+
mingw-w64-ucrt-x86_64-shaderc
277+
```
278+
Switch into `llama.cpp` directory and build using CMake.
279+
```sh
280+
cmake -B build -DGGML_VULKAN=ON
281+
cmake --build build --config Release
282+
```
283+
245284
**With docker**:
246285

247286
You don't need to install Vulkan SDK. It will be installed inside the container.

ggml/.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
src/ggml-vulkan-shaders.hpp
2+
src/ggml-vulkan-shaders.cpp

0 commit comments

Comments
 (0)