From d2d9ae6873c9763e252cf82082cf8cb3f79ce96e Mon Sep 17 00:00:00 2001 From: Alejandro Saucedo Date: Sun, 30 Jan 2022 13:25:04 +0000 Subject: [PATCH] Android fixed example Signed-off-by: Alejandro Saucedo --- .../android/android-simple/app/build.gradle | 2 +- .../app/src/main/cpp/KomputeModelML.cpp | 59 +++++++++++-------- .../app/src/main/cpp/KomputeModelML.hpp | 4 +- examples/android/android-simple/build.gradle | 2 +- single_include/kompute/Kompute.hpp | 2 +- src/Manager.cpp | 8 +-- 6 files changed, 42 insertions(+), 35 deletions(-) diff --git a/examples/android/android-simple/app/build.gradle b/examples/android/android-simple/app/build.gradle index 146bb4163..f355ad795 100644 --- a/examples/android/android-simple/app/build.gradle +++ b/examples/android/android-simple/app/build.gradle @@ -14,7 +14,7 @@ android { versionName = "0.0.1" externalNativeBuild { cmake { - abiFilters "armeabi-v7a", 'arm64-v8a', 'x86', 'x86_64' + abiFilters "armeabi-v7a", 'arm64-v8a', 'x86' arguments '-DANDROID_TOOLCHAIN=clang', '-DANDROID_STL=c++_static', '-DKOMPUTE_OPT_ANDROID_BUILD=1', 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 ef604909b..e9fc67d68 100755 --- a/examples/android/android-simple/app/src/main/cpp/KomputeModelML.cpp +++ b/examples/android/android-simple/app/src/main/cpp/KomputeModelML.cpp @@ -23,37 +23,38 @@ void KomputeModelML::train(std::vector yData, std::vector xIData, { kp::Manager mgr; - std::shared_ptr xI = mgr.tensor(xIData); - std::shared_ptr xJ = mgr.tensor(xJData); + std::shared_ptr> xI = mgr.tensor(xIData); + std::shared_ptr> xJ = mgr.tensor(xJData); - std::shared_ptr y = mgr.tensor(yData); + std::shared_ptr> y = mgr.tensor(yData); - std::shared_ptr wIn = mgr.tensor({ 0.001, 0.001 }); - std::shared_ptr wOutI = mgr.tensor(zerosData); - std::shared_ptr wOutJ = mgr.tensor(zerosData); + std::shared_ptr> wIn = mgr.tensor({ 0.001, 0.001 }); + std::shared_ptr> wOutI = mgr.tensor(zerosData); + std::shared_ptr> wOutJ = mgr.tensor(zerosData); - std::shared_ptr bIn = mgr.tensor({ 0 }); - std::shared_ptr bOut = mgr.tensor(zerosData); + std::shared_ptr> bIn = mgr.tensor({ 0 }); + std::shared_ptr> bOut = mgr.tensor(zerosData); - std::shared_ptr lOut = mgr.tensor(zerosData); + std::shared_ptr> lOut = mgr.tensor(zerosData); std::vector> params = { xI, xJ, y, wIn, wOutI, wOutJ, bIn, bOut, lOut }; - std::vector spirv( - (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)); + std::vector spirv = 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)); - std::shared_ptr algo = - mgr.algorithm(params, spirv, kp::Workgroup({ 5 }), std::vector({ 5.0 })); + + std::shared_ptr algorithm = mgr.algorithm( + params, spirv, kp::Workgroup({ 5 }), std::vector({ 5.0 })); mgr.sequence()->eval(params); std::shared_ptr sq = mgr.sequence() ->record({ wIn, bIn }) - ->record(algo) + ->record(algorithm) ->record({ wOutI, wOutJ, bOut, lOut }); // Iterate across all expected iterations @@ -73,12 +74,15 @@ void KomputeModelML::train(std::vector yData, std::vector xIData, KP_LOG_INFO("{}", wIn->data()[1]); KP_LOG_INFO("{}", bIn->data()[0]); - this->mWeights = wIn; - this->mBias = bIn; + this->mWeights = wIn->vector(); + this->mBias = bIn->vector(); } } std::vector KomputeModelML::predict(std::vector xI, std::vector xJ) { + + KP_LOG_INFO("Running prediction inference"); + assert(xI.size() == xJ.size()); std::vector retVector; @@ -89,28 +93,33 @@ std::vector KomputeModelML::predict(std::vector xI, std::vectormWeights->data()[0] - + xJVal * this->mWeights->data()[1] - + this->mBias->data()[0]); + float result = (xIVal * this->mWeights[0] + + xJVal * this->mWeights[1] + + this->mBias[0]); // Instead of using sigmoid we'll just return full numbers float var = result > 0 ? 1 : 0; retVector.push_back(var); } + KP_LOG_INFO("Inference finalised"); + return retVector; } std::vector KomputeModelML::get_params() { + + KP_LOG_INFO("Displaying results"); + std::vector retVector; - if(this->mWeights->size() + this->mBias->size() == 0) { + if(this->mWeights.size() + this->mBias.size() == 0) { return retVector; } - retVector.push_back(this->mWeights->data()[0]); - retVector.push_back(this->mWeights->data()[1]); - retVector.push_back(this->mBias->data()[0]); + retVector.push_back(this->mWeights[0]); + retVector.push_back(this->mWeights[1]); + retVector.push_back(this->mBias[0]); retVector.push_back(99.0); return retVector; diff --git a/examples/android/android-simple/app/src/main/cpp/KomputeModelML.hpp b/examples/android/android-simple/app/src/main/cpp/KomputeModelML.hpp index 093edbafc..558760e36 100755 --- a/examples/android/android-simple/app/src/main/cpp/KomputeModelML.hpp +++ b/examples/android/android-simple/app/src/main/cpp/KomputeModelML.hpp @@ -21,8 +21,8 @@ public: std::vector get_params(); private: - std::shared_ptr mWeights; - std::shared_ptr mBias; + std::vector mWeights; + std::vector mBias; }; diff --git a/examples/android/android-simple/build.gradle b/examples/android/android-simple/build.gradle index c4c40217e..31a2d163f 100644 --- a/examples/android/android-simple/build.gradle +++ b/examples/android/android-simple/build.gradle @@ -22,4 +22,4 @@ allprojects { task clean(type: Delete) { delete rootProject.buildDir -} +} \ No newline at end of file diff --git a/single_include/kompute/Kompute.hpp b/single_include/kompute/Kompute.hpp index b9c392ef1..eb2f674fb 100755 --- a/single_include/kompute/Kompute.hpp +++ b/single_include/kompute/Kompute.hpp @@ -1795,7 +1795,7 @@ class OpMult : public OpAlgoDispatch KP_LOG_DEBUG("Kompute OpMult constructor with params"); if (tensors.size() != 3) { - throw std::runtime_error("Kompute OpMult expected 3 tensors but got " + tensors.size()); + throw std::runtime_error("Kompute OpMult expected 3 tensors but got " + std::to_string(tensors.size())); } std::vector spirv( diff --git a/src/Manager.cpp b/src/Manager.cpp index 0ce3df622..8a99665f8 100644 --- a/src/Manager.cpp +++ b/src/Manager.cpp @@ -290,8 +290,9 @@ Manager::createDevice(const std::vector& familyQueueIndices, this->mFreeDevice = true; // Getting an integer that says how many vuklan devices we have - uint32_t deviceCount = 0; - this->mInstance->enumeratePhysicalDevices(&deviceCount, nullptr); + std::vector physicalDevices = + this->mInstance->enumeratePhysicalDevices(); + uint32_t deviceCount = physicalDevices.size(); // This means there are no devices at all if (deviceCount == 0) { @@ -308,9 +309,6 @@ Manager::createDevice(const std::vector& familyQueueIndices, "please use your existing device"); } - std::vector physicalDevices = - this->mInstance->enumeratePhysicalDevices(); - vk::PhysicalDevice physicalDevice = physicalDevices[physicalDeviceIndex]; this->mPhysicalDevice =