diff --git a/.github/workflows/cpp_tests.yml b/.github/workflows/cpp_tests.yml index 146c4141d..e8b42998f 100644 --- a/.github/workflows/cpp_tests.yml +++ b/.github/workflows/cpp_tests.yml @@ -19,6 +19,7 @@ jobs: - name: configure-cpp run: | cmake -Bbuild/ \ + -DCMAKE_BUILD_TYPE=Debug \ -DKOMPUTE_OPT_INSTALL=0 \ -DKOMPUTE_OPT_REPO_SUBMODULE_BUILD=1 \ -DKOMPUTE_OPT_BUILD_TESTS=1 \ diff --git a/README.md b/README.md index 3b96a4c6e..e4a302a07 100644 --- a/README.md +++ b/README.md @@ -78,7 +78,7 @@ int main() { // 3. Run operation with string shader synchronously mgr.evalOpDefault( { tensorInA, tensorInB, tensorOut }, - std::vector(shaderString.begin(), shaderString.end())); + std::vector(shaderString.begin(), shaderString.end())); // 4. Map results back from GPU memory to print the results mgr.evalOpDefault({ tensorInA, tensorInB, tensorOut }); diff --git a/examples/android/android-simple/app/src/main/cpp/KomputeModelML.cpp b/examples/android/android-simple/app/src/main/cpp/KomputeModelML.cpp index 0337fa63e..679136bfa 100755 --- a/examples/android/android-simple/app/src/main/cpp/KomputeModelML.cpp +++ b/examples/android/android-simple/app/src/main/cpp/KomputeModelML.cpp @@ -54,11 +54,11 @@ void KomputeModelML::train(std::vector yData, std::vector xIData, #ifdef KOMPUTE_ANDROID_SHADER_FROM_STRING // Newer versions of Android are able to use shaderc to read raw string sq->record( - params, std::vector(LR_SHADER.begin(), LR_SHADER.end())); + params, std::vector(LR_SHADER.begin(), LR_SHADER.end())); #else // Older versions of Android require the SPIRV binary directly sq->record( - params, std::vector( + params, std::vector( kp::shader_data::shaders_glsl_logisticregression_comp_spv, kp::shader_data::shaders_glsl_logisticregression_comp_spv + kp::shader_data::shaders_glsl_logisticregression_comp_spv_len diff --git a/examples/array_multiplication/src/Main.cpp b/examples/array_multiplication/src/Main.cpp index 161bb8bd4..d77388671 100755 --- a/examples/array_multiplication/src/Main.cpp +++ b/examples/array_multiplication/src/Main.cpp @@ -40,11 +40,11 @@ int main() mgr.evalOpDefault( { tensorInA, tensorInB, tensorOut }, - std::vector(shader.begin(), shader.end())); + std::vector(shader.begin(), shader.end())); #else mgr.evalOpDefault( { tensorInA, tensorInB, tensorOut }, - std::vector( + std::vector( kp::shader_data::shaders_glsl_opmult_comp_spv, kp::shader_data::shaders_glsl_opmult_comp_spv + kp::shader_data::shaders_glsl_opmult_comp_spv_len)); diff --git a/examples/logistic_regression/src/Main.cpp b/examples/logistic_regression/src/Main.cpp index 14664a563..4138a0a0f 100755 --- a/examples/logistic_regression/src/Main.cpp +++ b/examples/logistic_regression/src/Main.cpp @@ -49,7 +49,7 @@ int main() params, "shaders/glsl/logistic_regression.comp"); #else sq->record( - params, std::vector( + params, std::vector( kp::shader_data::shaders_glsl_logisticregression_comp_spv, kp::shader_data::shaders_glsl_logisticregression_comp_spv + kp::shader_data::shaders_glsl_logisticregression_comp_spv_len)); diff --git a/single_include/kompute/Kompute.hpp b/single_include/kompute/Kompute.hpp index 1c2c5f3ac..0d6a4f41f 100755 --- a/single_include/kompute/Kompute.hpp +++ b/single_include/kompute/Kompute.hpp @@ -118,13 +118,13 @@ namespace kp { class Shader { public: - static std::vector compile_sources( + static std::vector compile_sources( const std::vector& sources, const std::vector& files = {}, const std::string& entryPoint = "main", std::vector> definitions = {}); - static std::vector compile_source( + static std::vector compile_source( const std::string& source, const std::string& entryPoint = "main", std::vector> definitions = {}); @@ -1683,7 +1683,7 @@ public: * @specalizationInstalces The specialization parameters to pass to the function * processing */ - void init(const std::vector& shaderFileData, + void init(const std::vector& shaderFileData, std::vector> tensorParams); /** @@ -1727,7 +1727,7 @@ private: Constants mSpecializationConstants; // Create util functions - void createShaderModule(const std::vector& shaderFileData); + void createShaderModule(const std::vector& shaderFileData); void createPipeline(); // Parameters @@ -1808,7 +1808,7 @@ class OpAlgoBase : public OpBase std::shared_ptr device, std::shared_ptr commandBuffer, std::vector>& tensors, - const std::vector& shaderDataRaw, + const std::vector& shaderDataRaw, const Workgroup& komputeWorkgroup = {}, const Constants& specializationConstants = {}); @@ -1860,9 +1860,9 @@ class OpAlgoBase : public OpBase Workgroup mKomputeWorkgroup; std::string mShaderFilePath; ///< Optional member variable which can be provided for the OpAlgoBase to find the data automatically and load for processing - std::vector mShaderDataRaw; ///< Optional member variable which can be provided to contain either the raw shader content or the spirv binary content + std::vector mShaderDataRaw; ///< Optional member variable which can be provided to contain either the raw shader content or the spirv binary content - virtual std::vector fetchSpirvBinaryData(); + virtual std::vector fetchSpirvBinaryData(); }; } // End namespace kp @@ -1985,7 +1985,7 @@ class OpMult : public OpAlgoBase SPDLOG_DEBUG("Kompute OpMult constructor with params"); #ifndef RELEASE - this->mShaderFilePath = "shaders/glsl/opmult.comp"; + this->mShaderFilePath = "shaders/glsl/opmult.comp.spv"; #endif } @@ -1994,15 +1994,15 @@ class OpMult : public OpAlgoBase * If RELEASE=1 it will be using the static version of the shader which is * loaded using this file directly. Otherwise it should not override the function. */ - std::vector fetchSpirvBinaryData() override + std::vector fetchSpirvBinaryData() override { SPDLOG_WARN( "Kompute OpMult Running shaders directly from header"); - return std::vector( - shader_data::shaders_glsl_opmult_comp_spv, - shader_data::shaders_glsl_opmult_comp_spv + - kp::shader_data::shaders_glsl_opmult_comp_spv_len); + return std::vector( + (uint32_t*)shader_data::shaders_glsl_opmult_comp_spv, + (uint32_t*)(shader_data::shaders_glsl_opmult_comp_spv + + kp::shader_data::shaders_glsl_opmult_comp_spv_len)); } #endif diff --git a/src/Algorithm.cpp b/src/Algorithm.cpp index 227a9b6bc..48968b232 100644 --- a/src/Algorithm.cpp +++ b/src/Algorithm.cpp @@ -108,7 +108,7 @@ Algorithm::~Algorithm() } void -Algorithm::init(const std::vector& shaderFileData, +Algorithm::init(const std::vector& shaderFileData, std::vector> tensorParams) { SPDLOG_DEBUG("Kompute Algorithm init started"); @@ -206,14 +206,14 @@ Algorithm::createParameters(std::vector>& tensorParams) } void -Algorithm::createShaderModule(const std::vector& shaderFileData) +Algorithm::createShaderModule(const std::vector& shaderFileData) { SPDLOG_DEBUG("Kompute Algorithm createShaderModule started"); vk::ShaderModuleCreateInfo shaderModuleInfo( vk::ShaderModuleCreateFlags(), - shaderFileData.size(), - (uint32_t*)shaderFileData.data()); + sizeof(uint32_t) * shaderFileData.size(), + shaderFileData.data()); SPDLOG_DEBUG("Kompute Algorithm Creating shader module. ShaderFileSize: {}", shaderFileData.size()); diff --git a/src/OpAlgoBase.cpp b/src/OpAlgoBase.cpp index 04c4cdebe..ee22c6fe1 100644 --- a/src/OpAlgoBase.cpp +++ b/src/OpAlgoBase.cpp @@ -61,7 +61,7 @@ OpAlgoBase::OpAlgoBase(std::shared_ptr physicalDevice, std::shared_ptr device, std::shared_ptr commandBuffer, std::vector>& tensors, - const std::vector& shaderDataRaw, + const std::vector& shaderDataRaw, const Workgroup& komputeWorkgroup, const Constants& specializationConstants) : OpAlgoBase(physicalDevice, device, commandBuffer, tensors, komputeWorkgroup, specializationConstants) @@ -98,7 +98,7 @@ OpAlgoBase::init() SPDLOG_DEBUG("Kompute OpAlgoBase fetching spirv data"); - std::vector shaderFileData = this->fetchSpirvBinaryData(); + std::vector shaderFileData = this->fetchSpirvBinaryData(); SPDLOG_DEBUG("Kompute OpAlgoBase Initialising algorithm component"); @@ -137,7 +137,7 @@ OpAlgoBase::postEval() SPDLOG_DEBUG("Kompute OpAlgoBase postSubmit called"); } -std::vector +std::vector OpAlgoBase::fetchSpirvBinaryData() { SPDLOG_DEBUG("Kompute OpAlgoBase Running fetchSpirvBinaryData"); @@ -162,7 +162,7 @@ OpAlgoBase::fetchSpirvBinaryData() SPDLOG_WARN("Kompute OpAlgoBase fetched {} bytes", shaderFileSize); - return std::vector(shaderDataRaw, shaderDataRaw + shaderFileSize); + return std::vector((uint32_t*)shaderDataRaw, (uint32_t*)(shaderDataRaw + shaderFileSize)); } else if (this->mShaderDataRaw.size()) { SPDLOG_DEBUG("Kompute OpAlgoBase Reading data from data provided"); return this->mShaderDataRaw; diff --git a/src/OpAlgoLhsRhsOut.cpp b/src/OpAlgoLhsRhsOut.cpp index 51a1d0fb9..a12583f29 100644 --- a/src/OpAlgoLhsRhsOut.cpp +++ b/src/OpAlgoLhsRhsOut.cpp @@ -67,7 +67,7 @@ OpAlgoLhsRhsOut::init() SPDLOG_DEBUG("Kompute OpAlgoLhsRhsOut fetching spirv data"); - std::vector shaderFileData = this->fetchSpirvBinaryData(); + std::vector shaderFileData = this->fetchSpirvBinaryData(); SPDLOG_DEBUG("Kompute OpAlgoLhsRhsOut Initialising algorithm component"); diff --git a/src/Shader.cpp b/src/Shader.cpp index 467cc07f2..4c2268d93 100644 --- a/src/Shader.cpp +++ b/src/Shader.cpp @@ -3,7 +3,7 @@ namespace kp { -std::vector +std::vector Shader::compile_sources(const std::vector& sources, const std::vector& files, const std::string& entryPoint, @@ -81,10 +81,10 @@ Shader::compile_sources(const std::vector& sources, // Shutdown glslang library. glslang::FinalizeProcess(); - return std::vector((char*)spirv.data(), (char*)(spirv.data()+spirv.size()) ); + return spirv; } -std::vector +std::vector Shader::compile_source(const std::string& source, const std::string& entryPoint, std::vector> definitions) { diff --git a/src/include/kompute/Algorithm.hpp b/src/include/kompute/Algorithm.hpp index 361ebe4e5..a859b79d3 100644 --- a/src/include/kompute/Algorithm.hpp +++ b/src/include/kompute/Algorithm.hpp @@ -39,7 +39,7 @@ public: * @specalizationInstalces The specialization parameters to pass to the function * processing */ - void init(const std::vector& shaderFileData, + void init(const std::vector& shaderFileData, std::vector> tensorParams); /** @@ -83,7 +83,7 @@ private: Constants mSpecializationConstants; // Create util functions - void createShaderModule(const std::vector& shaderFileData); + void createShaderModule(const std::vector& shaderFileData); void createPipeline(); // Parameters diff --git a/src/include/kompute/Shader.hpp b/src/include/kompute/Shader.hpp index 97158cf56..89ecc2aeb 100644 --- a/src/include/kompute/Shader.hpp +++ b/src/include/kompute/Shader.hpp @@ -13,13 +13,13 @@ namespace kp { class Shader { public: - static std::vector compile_sources( + static std::vector compile_sources( const std::vector& sources, const std::vector& files = {}, const std::string& entryPoint = "main", std::vector> definitions = {}); - static std::vector compile_source( + static std::vector compile_source( const std::string& source, const std::string& entryPoint = "main", std::vector> definitions = {}); diff --git a/src/include/kompute/operations/OpAlgoBase.hpp b/src/include/kompute/operations/OpAlgoBase.hpp index 95c5853f0..49d0569b7 100644 --- a/src/include/kompute/operations/OpAlgoBase.hpp +++ b/src/include/kompute/operations/OpAlgoBase.hpp @@ -82,7 +82,7 @@ class OpAlgoBase : public OpBase std::shared_ptr device, std::shared_ptr commandBuffer, std::vector>& tensors, - const std::vector& shaderDataRaw, + const std::vector& shaderDataRaw, const Workgroup& komputeWorkgroup = {}, const Constants& specializationConstants = {}); @@ -135,9 +135,9 @@ class OpAlgoBase : public OpBase Workgroup mKomputeWorkgroup; std::string mShaderFilePath; ///< Optional member variable which can be provided for the OpAlgoBase to find the data automatically and load for processing - std::vector mShaderDataRaw; ///< Optional member variable which can be provided to contain either the raw shader content or the spirv binary content + std::vector mShaderDataRaw; ///< Optional member variable which can be provided to contain either the raw shader content or the spirv binary content - virtual std::vector fetchSpirvBinaryData(); + virtual std::vector fetchSpirvBinaryData(); }; } // End namespace kp diff --git a/src/include/kompute/operations/OpMult.hpp b/src/include/kompute/operations/OpMult.hpp index 8d3263fef..a887f4af2 100644 --- a/src/include/kompute/operations/OpMult.hpp +++ b/src/include/kompute/operations/OpMult.hpp @@ -50,7 +50,7 @@ class OpMult : public OpAlgoBase SPDLOG_DEBUG("Kompute OpMult constructor with params"); #ifndef RELEASE - this->mShaderFilePath = "shaders/glsl/opmult.comp"; + this->mShaderFilePath = "shaders/glsl/opmult.comp.spv"; #endif } @@ -59,15 +59,15 @@ class OpMult : public OpAlgoBase * If RELEASE=1 it will be using the static version of the shader which is * loaded using this file directly. Otherwise it should not override the function. */ - std::vector fetchSpirvBinaryData() override + std::vector fetchSpirvBinaryData() override { SPDLOG_WARN( "Kompute OpMult Running shaders directly from header"); - return std::vector( - shader_data::shaders_glsl_opmult_comp_spv, - shader_data::shaders_glsl_opmult_comp_spv + - kp::shader_data::shaders_glsl_opmult_comp_spv_len); + return std::vector( + (uint32_t*)shader_data::shaders_glsl_opmult_comp_spv, + (uint32_t*)(shader_data::shaders_glsl_opmult_comp_spv + + kp::shader_data::shaders_glsl_opmult_comp_spv_len)); } #endif diff --git a/test/TestAsyncOperations.cpp b/test/TestAsyncOperations.cpp index b0deee37c..d5d48b9d4 100644 --- a/test/TestAsyncOperations.cpp +++ b/test/TestAsyncOperations.cpp @@ -151,6 +151,8 @@ TEST(TestAsyncOperations, TestManagerAsyncExecution) mgr.rebuild({ tensorA, tensorB }); + std::vector result = kp::Shader::compile_source(shader); + mgr.evalOpAsync( { tensorA }, "asyncOne", kp::Shader::compile_source(shader)); diff --git a/test/TestLogisticRegression.cpp b/test/TestLogisticRegression.cpp index ed3106881..39e4ff8af 100644 --- a/test/TestLogisticRegression.cpp +++ b/test/TestLogisticRegression.cpp @@ -43,10 +43,10 @@ TEST(TestLogisticRegression, TestMainLogisticRegression) sq->record( params, - std::vector( - kp::shader_data::shaders_glsl_logisticregression_comp_spv, - kp::shader_data::shaders_glsl_logisticregression_comp_spv + - kp::shader_data::shaders_glsl_logisticregression_comp_spv_len), + std::vector( + (uint32_t*)kp::shader_data::shaders_glsl_logisticregression_comp_spv, + (uint32_t*)(kp::shader_data::shaders_glsl_logisticregression_comp_spv + + kp::shader_data::shaders_glsl_logisticregression_comp_spv_len)), kp::Workgroup(), kp::Constants({5.0})); sq->record({ wOutI, wOutJ, bOut, lOut }); @@ -81,7 +81,7 @@ TEST(TestLogisticRegression, TestMainLogisticRegression) bIn->data()[0]); } -TEST(TestLogisticRegressionAlgorithm, TestMainLogisticRegressionManualCopy) +TEST(TestLogisticRegression, TestMainLogisticRegressionManualCopy) { uint32_t ITERATIONS = 100; @@ -120,19 +120,13 @@ TEST(TestLogisticRegressionAlgorithm, TestMainLogisticRegressionManualCopy) // Record op algo base sq->begin(); -#ifdef KOMPUTE_SHADER_FROM_STRING - sq->record( - params, "test/shaders/glsl/test_logistic_regression.comp.spv", - kp::Workgroup(), kp::Algorithm::SpecializationContainer{{(uint32_t)5}}); -#else sq->record( params, - std::vector( - kp::shader_data::shaders_glsl_logisticregression_comp_spv, - kp::shader_data::shaders_glsl_logisticregression_comp_spv + - kp::shader_data::shaders_glsl_logisticregression_comp_spv_len), - kp::Workgroup(), kp::Constants({5.0})); -#endif + std::vector( + (uint32_t*)kp::shader_data::shaders_glsl_logisticregression_comp_spv, + (uint32_t*)(kp::shader_data::shaders_glsl_logisticregression_comp_spv + + kp::shader_data::shaders_glsl_logisticregression_comp_spv_len)), + kp::Workgroup(), kp::Constants({5.0})); sq->record({ wOutI, wOutJ, bOut, lOut }); diff --git a/test/TestOpShadersFromStringAndFile.cpp b/test/TestOpShadersFromStringAndFile.cpp index b33b2f98e..1fd121966 100644 --- a/test/TestOpShadersFromStringAndFile.cpp +++ b/test/TestOpShadersFromStringAndFile.cpp @@ -47,11 +47,11 @@ TEST(TestOpAlgoBase, ShaderCompiledDataFromConstructor) mgr.evalOpDefault( { tensorA, tensorB }, - std::vector( - kp::shader_data::test_shaders_glsl_test_op_custom_shader_comp_spv, - kp::shader_data::test_shaders_glsl_test_op_custom_shader_comp_spv + + std::vector( + (uint32_t*)kp::shader_data::test_shaders_glsl_test_op_custom_shader_comp_spv, + (uint32_t*)(kp::shader_data::test_shaders_glsl_test_op_custom_shader_comp_spv + kp::shader_data:: - test_shaders_glsl_test_op_custom_shader_comp_spv_len)); + test_shaders_glsl_test_op_custom_shader_comp_spv_len))); mgr.evalOpDefault({ tensorA, tensorB }); diff --git a/test/TestWorkgroup.cpp b/test/TestWorkgroup.cpp index d6684c47a..1116fcbe5 100644 --- a/test/TestWorkgroup.cpp +++ b/test/TestWorkgroup.cpp @@ -25,10 +25,10 @@ TEST(TestWorkgroup, TestSimpleWorkgroup) sq->begin(); sq->record( { tensorA, tensorB }, - std::vector( - kp::shader_data::test_shaders_glsl_test_workgroup_comp_spv, - kp::shader_data::test_shaders_glsl_test_workgroup_comp_spv + - kp::shader_data::test_shaders_glsl_test_workgroup_comp_spv_len), + std::vector( + (uint32_t*)kp::shader_data::test_shaders_glsl_test_workgroup_comp_spv, + (uint32_t*)(kp::shader_data::test_shaders_glsl_test_workgroup_comp_spv + + kp::shader_data::test_shaders_glsl_test_workgroup_comp_spv_len)), workgroup); sq->end();