Added initial iteration of shaderc

This commit is contained in:
Alejandro Saucedo 2021-02-18 21:05:17 +00:00
parent b9e0b5e988
commit c1b53cda9d
7 changed files with 123 additions and 1 deletions

2
.ccls
View file

@ -17,6 +17,8 @@
-I./python/pybind11/include/
-I./external/Vulkan-Headers/include/
-I./external/googletest/googletest/include/
-I./external/shaderc/libshaderc/include/
-I./external/shaderc/libshaderc_util/include/
-I./external/spdlog/include/
-I./src/include/
-I./single_include/

4
.gitmodules vendored
View file

@ -14,3 +14,7 @@
path = python/pybind11
url = https://github.com/pybind/pybind11
branch = v2.6.1
[submodule "external/shaderc"]
path = external/shaderc
url = https://github.com/google/shaderc
branch = v2020.4

View file

@ -70,6 +70,7 @@ mk_cmake:
-DKOMPUTE_OPT_ENABLE_SPDLOG=1 \
-DSPDLOG_INSTALL=1 \
-DKOMPUTE_OPT_CODE_COVERAGE=1 \
-DSHADERC_SKIP_TESTS=1 \
-G "Unix Makefiles"
mk_build_all:
@ -88,7 +89,7 @@ mk_run_docs: mk_build_docs
(cd build/docs/sphinx && python2.7 -m SimpleHTTPServer)
mk_run_tests: mk_build_tests
./build/test/test_kompute $(FILTER_TESTS)
./build/test/test_kompute --gtest_filter=$(FILTER_TESTS)
mk_build_swiftshader_library:
git clone https://github.com/google/swiftshader || echo "Assuming already cloned"
@ -99,6 +100,9 @@ mk_build_swiftshader_library:
mk_run_tests_cpu: export VK_ICD_FILENAMES=$(PWD)/swiftshader/build/vk_swiftshader_icd.json
mk_run_tests_cpu: mk_build_swiftshader_library mk_build_tests mk_run_tests_cpu_only
mk_run_tests_only:
./build/test/test_kompute --gtest_filter="-TestAsyncOperations.*"
mk_run_tests_cpu_only:
./build/test/test_kompute --gtest_filter="TestLogisticRegressionAlgorithm.*"
./build/test/test_kompute --gtest_filter="TestManager.*"
@ -133,6 +137,7 @@ vs_cmake:
-DKOMPUTE_OPT_BUILD_SINGLE_HEADER=1 \
-DKOMPUTE_OPT_ENABLE_SPDLOG=1 \
-DSPDLOG_INSTALL=1 \
-DSHADERC_SKIP_TESTS=1 \
-G "Visual Studio 16 2019"
vs_build_all:

1
external/shaderc vendored Submodule

@ -0,0 +1 @@
Subproject commit 0dbd899941a43ffd55df527d65128b3b66e75c9c

View file

@ -1,4 +1,7 @@
#####################################################
#################### GETEST #######################
#####################################################
enable_testing()
if(KOMPUTE_OPT_REPO_SUBMODULE_BUILD)
add_subdirectory(${PROJECT_SOURCE_DIR}/external/googletest EXCLUDE_FROM_ALL
@ -35,6 +38,35 @@ target_link_libraries(test_kompute PRIVATE kompute)
add_test(NAME test_kompute COMMAND test_kompute)
#####################################################
#################### PYSHADERC #######################
#####################################################
if(KOMPUTE_OPT_REPO_SUBMODULE_BUILD)
add_subdirectory(${PROJECT_SOURCE_DIR}/external/shaderc EXCLUDE_FROM_ALL
${CMAKE_CURRENT_BINARY_DIR}/kompute_shaderc)
target_include_directories(
test_kompute PRIVATE
${shaderc_SOURCE_DIR}/include)
target_link_libraries(test_kompute PRIVATE
shaderc_combined)
else()
find_library(SHADERC_LIB shaderc_combined)
find_path(SHADERC_INCLUDE_DIRS shaderc)
target_include_directories(
test_kompute PRIVATE
${SHADERC_INCLUDE_DIRS}/include)
MESSAGE(STATUS "INclude dirs:" ${SHADERC_INCLUDE_DIRS})
target_link_libraries(test_kompute PRIVATE
shaderc_combined)
endif()
#####################################################
#################### CODECOV #######################
#####################################################

View file

@ -0,0 +1,51 @@
#include "gtest/gtest.h"
#include "kompute/Kompute.hpp"
TEST(TestSpecializationConstants, TestTwoConstants)
{
std::shared_ptr<kp::Tensor> tensorA{ new kp::Tensor({ 0, 0, 0 }) };
std::shared_ptr<kp::Tensor> tensorB{ new kp::Tensor({ 0, 0, 0 }) };
std::string shader(R"(
#version 450
layout (constant_id = 0) const float cOne = 1;
layout (constant_id = 1) const float cTwo = 1;
layout (local_size_x = 1) in;
layout(set = 0, binding = 0) buffer a { float pa[]; };
layout(set = 0, binding = 1) buffer b { float pb[]; };
void main() {
uint index = gl_GlobalInvocationID.x;
pa[index] = cOne;
pb[index] = cTwo;
})");
{
std::shared_ptr<kp::Sequence> sq = nullptr;
{
kp::Manager mgr;
mgr.rebuild({ tensorA, tensorB });
sq = mgr.sequence();
auto spec = kp::Constants({5.0, 0.3});
sq->begin();
sq->record<kp::OpAlgoBase>(
{ tensorA, tensorB },
std::vector<char>(shader.begin(), shader.end()),
kp::Workgroup(), spec);
sq->end();
sq->eval();
mgr.evalOpDefault<kp::OpTensorSyncLocal>({ tensorA, tensorB });
}
}
EXPECT_EQ(tensorA->data(), std::vector<float>({ 5, 5, 5 }));
EXPECT_EQ(tensorB->data(), std::vector<float>({ 0.3, 0.3, 0.3 }));
}

27
test/TestUtils.cpp Normal file
View file

@ -0,0 +1,27 @@
#include <iostream>
#include <vector>
#include <shaderc/shaderc.hpp>
static std::vector<uint32_t> spirv_from_string(const std::string& source,
shaderc_optimization_level optimization = shaderc_optimization_level_size,
std::vector<std::pair<std::string,std::string>> definitions = {}) {
shaderc::Compiler compiler;
shaderc::CompileOptions options;
for (const std::pair<std::string,std::string>& def : definitions) {
options.AddMacroDefinition(def.first, def.second);
}
if (optimization) options.SetOptimizationLevel(optimization);
std::string errorTag = "kompute";
shaderc::SpvCompilationResult module =
compiler.CompileGlslToSpv(source, shaderc_glsl_default_compute_shader, errorTag.c_str(), options);
if (module.GetCompilationStatus() != shaderc_compilation_status_success) {
throw std::runtime_error("Shader string invalid: " + module.GetErrorMessage());
}
return {module.cbegin(), module.cend()};
}