From 2fb0641de0e38b12c5eec7b73a5a5781d6db1849 Mon Sep 17 00:00:00 2001 From: Alejandro Saucedo Date: Sat, 20 Feb 2021 17:06:54 +0000 Subject: [PATCH] Updated to use shader statics --- single_include/AggregateHeaders.cpp | 2 +- single_include/kompute/Kompute.hpp | 94 +++---------------- .../kompute/ShaderUtil.hpp => Shader.cpp} | 26 +++-- src/include/kompute/Shader.hpp | 28 ++++++ test/TestAsyncOperations.cpp | 8 +- test/TestDestroy.cpp | 26 ++--- test/TestMultipleAlgoExecutions.cpp | 26 ++--- test/TestOpAlgoLoopsPassingData.cpp | 2 +- test/TestOpShadersFromStringAndFile.cpp | 2 +- test/TestSpecializationConstant.cpp | 2 +- 10 files changed, 85 insertions(+), 131 deletions(-) rename src/{include/kompute/ShaderUtil.hpp => Shader.cpp} (86%) create mode 100644 src/include/kompute/Shader.hpp diff --git a/single_include/AggregateHeaders.cpp b/single_include/AggregateHeaders.cpp index ee5f89bf7..725d04f51 100644 --- a/single_include/AggregateHeaders.cpp +++ b/single_include/AggregateHeaders.cpp @@ -1,6 +1,6 @@ #pragma once #include "kompute/Core.hpp" -#include "kompute/ShaderUtil.hpp" +#include "kompute/Shader.hpp" #include "kompute/shaders/shaderopmult.hpp" #include "kompute/shaders/shaderlogisticregression.hpp" #include "kompute/Manager.hpp" diff --git a/single_include/kompute/Kompute.hpp b/single_include/kompute/Kompute.hpp index 8471639e6..3ff857dc0 100755 --- a/single_include/kompute/Kompute.hpp +++ b/single_include/kompute/Kompute.hpp @@ -116,90 +116,20 @@ extern py::object kp_debug, kp_info, kp_warning, kp_error; namespace kp { -static std::vector spirv_from_sources(const std::vector& sources, - const std::vector& files = {}, - const std::string& entryPoint = "main", - std::vector> definitions = {}) { +class Shader { +public: + static std::vector compile( + const std::vector& sources, + const std::vector& files = {}, + const std::string& entryPoint = "main", + std::vector> definitions = {}); - // Initialize glslang library. - glslang::InitializeProcess(); - - // Currently we don't support other shader types nor plan to - const EShLanguage language = EShLangCompute; - glslang::TShader shader(language); - - std::vector filesCStr(files.size()), sourcesCStr(sources.size()); - for (size_t i = 0; i < sources.size(); i++) sourcesCStr[i] = sources[i].c_str(); - - if (files.size() > 1) { - assert(files.size() == sources.size()); - for (size_t i = 0; i < files.size(); i++) filesCStr[i] = files[i].c_str(); - shader.setStringsWithLengthsAndNames(sourcesCStr.data(), nullptr, filesCStr.data(), filesCStr.size()); - } - else { - filesCStr = {""}; - shader.setStringsWithLengthsAndNames(sourcesCStr.data(), nullptr, filesCStr.data(), sourcesCStr.size()); - } - - shader.setEntryPoint(entryPoint.c_str()); - shader.setSourceEntryPoint(entryPoint.c_str()); - - std::string info_log = ""; - const EShMessages messages = static_cast(EShMsgDefault | EShMsgVulkanRules | EShMsgSpvRules); - if (!shader.parse(&glslang::DefaultTBuiltInResource, 100, false, messages)) - { - info_log = std::string(shader.getInfoLog()) + "\n" + std::string(shader.getInfoDebugLog()); - SPDLOG_ERROR(info_log); - throw std::runtime_error(info_log); - } - - // Add shader to new program object. - glslang::TProgram program; - program.addShader(&shader); - // Link program. - if (!program.link(messages)) - { - info_log = std::string(program.getInfoLog()) + "\n" + std::string(program.getInfoDebugLog()); - SPDLOG_ERROR(info_log); - throw std::runtime_error(info_log); - } - - // Save any info log that was generated. - if (shader.getInfoLog()) - { - info_log += std::string(shader.getInfoLog()) + "\n" + std::string(shader.getInfoDebugLog()) + "\n"; - SPDLOG_INFO(info_log); - } - - glslang::TIntermediate *intermediate = program.getIntermediate(language); - // Translate to SPIRV. - if (!intermediate) - { - info_log += "Failed to get shared intermediate code.\n"; - SPDLOG_ERROR(info_log); - throw std::runtime_error(info_log); - } - - spv::SpvBuildLogger logger; - std::vector spirv; - glslang::GlslangToSpv(*intermediate, spirv, &logger); - - if (shader.getInfoLog()) - { - info_log += logger.getAllMessages() + "\n"; - SPDLOG_DEBUG(info_log); - } - - // Shutdown glslang library. - glslang::FinalizeProcess(); - - return std::vector((char*)spirv.data(), (char*)(spirv.data()+spirv.size()) ); -} - -static std::vector spirv_from_source(const std::string& source) { - return spirv_from_sources({source}); -} + static std::vector compile( + const std::string& source, + const std::string& entryPoint = "main", + std::vector> definitions = {}); +}; } /* diff --git a/src/include/kompute/ShaderUtil.hpp b/src/Shader.cpp similarity index 86% rename from src/include/kompute/ShaderUtil.hpp rename to src/Shader.cpp index a6b994a6f..2f9e9243c 100644 --- a/src/include/kompute/ShaderUtil.hpp +++ b/src/Shader.cpp @@ -1,20 +1,13 @@ -#pragma once -#include -#include - -#include "Core.hpp" - -#include -#include -#include +#include "kompute/Shader.hpp" namespace kp { -static std::vector spirv_from_sources(const std::vector& sources, - const std::vector& files = {}, - const std::string& entryPoint = "main", - std::vector> definitions = {}) { +std::vector +Shader::compile(const std::vector& sources, + const std::vector& files, + const std::string& entryPoint, + std::vector> definitions) { // Initialize glslang library. glslang::InitializeProcess(); @@ -91,8 +84,11 @@ static std::vector spirv_from_sources(const std::vector& sour return std::vector((char*)spirv.data(), (char*)(spirv.data()+spirv.size()) ); } -static std::vector spirv_from_source(const std::string& source) { - return spirv_from_sources({source}); +std::vector +Shader::compile(const std::string& source, + const std::string& entryPoint, + std::vector> definitions) { + return compile({source}); } } diff --git a/src/include/kompute/Shader.hpp b/src/include/kompute/Shader.hpp new file mode 100644 index 000000000..9a97a892c --- /dev/null +++ b/src/include/kompute/Shader.hpp @@ -0,0 +1,28 @@ +#pragma once + +#include +#include + +#include "Core.hpp" + +#include +#include +#include + +namespace kp { + +class Shader { +public: + static std::vector compile( + const std::vector& sources, + const std::vector& files = {}, + const std::string& entryPoint = "main", + std::vector> definitions = {}); + + static std::vector compile( + const std::string& source, + const std::string& entryPoint = "main", + std::vector> definitions = {}); + +}; +} diff --git a/test/TestAsyncOperations.cpp b/test/TestAsyncOperations.cpp index ab3254443..b74088e2a 100644 --- a/test/TestAsyncOperations.cpp +++ b/test/TestAsyncOperations.cpp @@ -55,7 +55,7 @@ TEST(TestAsyncOperations, TestManagerParallelExecution) for (uint32_t i = 0; i < numParallel; i++) { mgr.evalOpDefault( - { inputsSyncB[i] }, kp::spirv_from_source(shader)); + { inputsSyncB[i] }, kp::Shader::compile(shader)); } auto endSync = std::chrono::high_resolution_clock::now(); @@ -89,7 +89,7 @@ TEST(TestAsyncOperations, TestManagerParallelExecution) mgrAsync.evalOpAsync( { inputsAsyncB[i] }, "async" + std::to_string(i), - kp::spirv_from_source(shader)); + kp::Shader::compile(shader)); } for (uint32_t i = 0; i < numParallel; i++) { @@ -152,10 +152,10 @@ TEST(TestAsyncOperations, TestManagerAsyncExecution) mgr.rebuild({ tensorA, tensorB }); mgr.evalOpAsync( - { tensorA }, "asyncOne", kp::spirv_from_source(shader)); + { tensorA }, "asyncOne", kp::Shader::compile(shader)); mgr.evalOpAsync( - { tensorB }, "asyncTwo", kp::spirv_from_source(shader)); + { tensorB }, "asyncTwo", kp::Shader::compile(shader)); mgr.evalOpAwait("asyncOne"); mgr.evalOpAwait("asyncTwo"); diff --git a/test/TestDestroy.cpp b/test/TestDestroy.cpp index 6e5ba3376..d2e81d0ee 100644 --- a/test/TestDestroy.cpp +++ b/test/TestDestroy.cpp @@ -28,7 +28,7 @@ TEST(TestDestroy, TestDestroyTensorSingle) sq->begin(); sq->record( - { tensorA }, kp::spirv_from_source(shader)); + { tensorA }, kp::Shader::compile(shader)); sq->end(); sq->eval(); @@ -71,7 +71,7 @@ TEST(TestDestroy, TestDestroyTensorVector) sq->begin(); sq->record( - { tensorA, tensorB }, kp::spirv_from_source(shader)); + { tensorA, tensorB }, kp::Shader::compile(shader)); sq->end(); sq->eval(); @@ -136,7 +136,7 @@ TEST(TestDestroy, TestDestroySequenceSingle) sq->begin(); sq->record( - { tensorA }, kp::spirv_from_source(shader)); + { tensorA }, kp::Shader::compile(shader)); sq->end(); sq->eval(); @@ -176,14 +176,14 @@ TEST(TestDestroy, TestDestroySequenceVector) sq1 = mgr.sequence("One"); sq1->begin(); sq1->record( - { tensorA }, kp::spirv_from_source(shader)); + { tensorA }, kp::Shader::compile(shader)); sq1->end(); sq1->eval(); sq2 = mgr.sequence("Two"); sq2->begin(); sq2->record( - { tensorA }, kp::spirv_from_source(shader)); + { tensorA }, kp::Shader::compile(shader)); sq2->end(); sq2->eval(); @@ -218,11 +218,11 @@ TEST(TestDestroy, TestDestroySequenceNameSingleInsideManager) mgr.evalOp( { tensorA }, "one", - kp::spirv_from_source(shader)); + kp::Shader::compile(shader)); mgr.evalOp( { tensorA }, "two", - kp::spirv_from_source(shader)); + kp::Shader::compile(shader)); mgr.evalOpDefault({ tensorA }); @@ -257,7 +257,7 @@ TEST(TestDestroy, TestDestroySequenceNameSingleOutsideManager) sq1 = mgr.sequence("One"); sq1->begin(); sq1->record( - { tensorA }, kp::spirv_from_source(shader)); + { tensorA }, kp::Shader::compile(shader)); sq1->end(); sq1->eval(); @@ -291,11 +291,11 @@ TEST(TestDestroy, TestDestroySequenceNameVectorInsideManager) mgr.evalOp( { tensorA }, "one", - kp::spirv_from_source(shader)); + kp::Shader::compile(shader)); mgr.evalOp( { tensorA }, "two", - kp::spirv_from_source(shader)); + kp::Shader::compile(shader)); mgr.evalOpDefault({ tensorA }); @@ -325,11 +325,11 @@ TEST(TestDestroy, TestDestroySequenceNameVectorOutsideManager) mgr.evalOp( { tensorA }, "one", - kp::spirv_from_source(shader)); + kp::Shader::compile(shader)); mgr.evalOp( { tensorA }, "two", - kp::spirv_from_source(shader)); + kp::Shader::compile(shader)); mgr.evalOpDefault({ tensorA }); @@ -359,7 +359,7 @@ TEST(TestDestroy, TestDestroySequenceNameDefaultOutsideManager) mgr.evalOpDefault( { tensorA }, - kp::spirv_from_source(shader)); + kp::Shader::compile(shader)); mgr.evalOpDefault({ tensorA }); diff --git a/test/TestMultipleAlgoExecutions.cpp b/test/TestMultipleAlgoExecutions.cpp index 727e2d5b4..901780c15 100644 --- a/test/TestMultipleAlgoExecutions.cpp +++ b/test/TestMultipleAlgoExecutions.cpp @@ -28,11 +28,11 @@ TEST(TestMultipleAlgoExecutions, SingleSequenceRecord) sq->begin(); sq->record( - { tensorA }, kp::spirv_from_source(shader)); + { tensorA }, kp::Shader::compile(shader)); sq->record( - { tensorA }, kp::spirv_from_source(shader)); + { tensorA }, kp::Shader::compile(shader)); sq->record( - { tensorA }, kp::spirv_from_source(shader)); + { tensorA }, kp::Shader::compile(shader)); sq->record({ tensorA }); @@ -73,19 +73,19 @@ TEST(TestMultipleAlgoExecutions, MultipleCmdBufRecords) // Then perform the computations sq->begin(); sq->record({ tensorA }, - kp::spirv_from_source(shader)); + kp::Shader::compile(shader)); sq->end(); sq->eval(); sq->begin(); sq->record({ tensorA }, - kp::spirv_from_source(shader)); + kp::Shader::compile(shader)); sq->end(); sq->eval(); sq->begin(); sq->record({ tensorA }, - kp::spirv_from_source(shader)); + kp::Shader::compile(shader)); sq->end(); sq->eval(); @@ -122,7 +122,7 @@ TEST(TestMultipleAlgoExecutions, MultipleSequences) sq->begin(); sq->record( - { tensorA }, kp::spirv_from_source(shader)); + { tensorA }, kp::Shader::compile(shader)); sq->end(); sq->eval(); @@ -135,7 +135,7 @@ TEST(TestMultipleAlgoExecutions, MultipleSequences) sq->begin(); sq->record( - { tensorA }, kp::spirv_from_source(shader)); + { tensorA }, kp::Shader::compile(shader)); sq->end(); sq->eval(); @@ -148,7 +148,7 @@ TEST(TestMultipleAlgoExecutions, MultipleSequences) sq->begin(); sq->record( - { tensorA }, kp::spirv_from_source(shader)); + { tensorA }, kp::Shader::compile(shader)); sq->end(); sq->eval(); @@ -206,7 +206,7 @@ TEST(TestMultipleAlgoExecutions, SingleRecordMultipleEval) sq->begin(); sq->record( - { tensorA }, kp::spirv_from_source(shader)); + { tensorA }, kp::Shader::compile(shader)); sq->end(); @@ -265,7 +265,7 @@ TEST(TestMultipleAlgoExecutions, ManagerEvalMultSourceStrOpCreate) mgr.evalOpDefault( { tensorInA, tensorInB, tensorOut }, - kp::spirv_from_source(shader)); + kp::Shader::compile(shader)); mgr.evalOpDefault({ tensorOut }); @@ -308,7 +308,7 @@ TEST(TestMultipleAlgoExecutions, ManagerEvalMultSourceStrMgrCreate) mgr.evalOpDefault( { tensorInA, tensorInB, tensorOut }, - kp::spirv_from_source(shader)); + kp::Shader::compile(shader)); mgr.evalOpDefault({ tensorOut }); @@ -340,7 +340,7 @@ TEST(TestMultipleAlgoExecutions, SequenceAlgoDestroyOutsideManagerScope) sq->begin(); sq->record( - { tensorA }, kp::spirv_from_source(shader)); + { tensorA }, kp::Shader::compile(shader)); sq->end(); sq->eval(); diff --git a/test/TestOpAlgoLoopsPassingData.cpp b/test/TestOpAlgoLoopsPassingData.cpp index 70412ee7c..f2353b761 100644 --- a/test/TestOpAlgoLoopsPassingData.cpp +++ b/test/TestOpAlgoLoopsPassingData.cpp @@ -53,7 +53,7 @@ TEST(TestProcessingIterations, IterateThroughMultipleSumAndCopies) sq->record( { tensorA, tensorB }, - kp::spirv_from_source(shader)); + kp::Shader::compile(shader)); sq->record({ tensorB, tensorA }); sq->end(); diff --git a/test/TestOpShadersFromStringAndFile.cpp b/test/TestOpShadersFromStringAndFile.cpp index f64cc16ed..4377e3b18 100644 --- a/test/TestOpShadersFromStringAndFile.cpp +++ b/test/TestOpShadersFromStringAndFile.cpp @@ -29,7 +29,7 @@ TEST(TestOpAlgoBase, ShaderRawDataFromConstructor) )"); mgr.evalOpDefault( - { tensorA, tensorB }, kp::spirv_from_source(shader)); + { tensorA, tensorB }, kp::Shader::compile(shader)); mgr.evalOpDefault({ tensorA, tensorB }); diff --git a/test/TestSpecializationConstant.cpp b/test/TestSpecializationConstant.cpp index a0a164901..6e2be2666 100644 --- a/test/TestSpecializationConstant.cpp +++ b/test/TestSpecializationConstant.cpp @@ -35,7 +35,7 @@ TEST(TestSpecializationConstants, TestTwoConstants) sq->begin(); sq->record( { tensorA, tensorB }, - kp::spirv_from_source(shader), + kp::Shader::compile(shader), kp::Workgroup(), spec); sq->end();