From ad542fe856e99bb2ee2d7a813cc6c13510d31356 Mon Sep 17 00:00:00 2001 From: Alejandro Gallo Date: Mon, 5 Dec 2022 21:16:30 +0100 Subject: [PATCH] Add the slicing into the GPU --- .dir-locals.el | 4 +- include/atrip/Unions.hpp | 122 ++++++++++++++++++++++----------------- 2 files changed, 71 insertions(+), 55 deletions(-) diff --git a/.dir-locals.el b/.dir-locals.el index bc7638c..505a857 100644 --- a/.dir-locals.el +++ b/.dir-locals.el @@ -13,7 +13,9 @@ (format "%s/include/" root) (format "%s/" root) (format "%s/bench/" root) - (format "%s/build/main/" root))))) + (format "%s/build/main/" root))) + (setq-local flycheck-clang-include-path + flycheck-gcc-include-path))) (eval . (flycheck-mode)) (eval . (outline-minor-mode)) (indent-tabs-mode . nil) diff --git a/include/atrip/Unions.hpp b/include/atrip/Unions.hpp index 7419f8e..26f8075 100644 --- a/include/atrip/Unions.hpp +++ b/include/atrip/Unions.hpp @@ -19,8 +19,14 @@ namespace atrip { template + static void sliceIntoVector - ( std::vector &v +#if defined(ATRIP_SOURCES_IN_GPU) + ( DataPtr &source +#else + ( std::vector &source +#endif + , size_t sliceSize , CTF::Tensor &toSlice , std::vector const low , std::vector const up @@ -44,18 +50,30 @@ namespace atrip { << "\n"; #ifndef ATRIP_DONT_SLICE - toSlice.slice( toSlice_.low.data() - , toSlice_.up.data() - , 0.0 - , origin - , origin_.low.data() - , origin_.up.data() - , 1.0); - memcpy(v.data(), toSlice.data, sizeof(F) * v.size()); + toSlice.slice(toSlice_.low.data(), + toSlice_.up.data(), + 0.0, + origin, + origin_.low.data(), + origin_.up.data(), + 1.0); #else # pragma message("WARNING: COMPILING WITHOUT SLICING THE TENSORS") #endif +#if defined(ATRIP_SOURCES_IN_GPU) + WITH_CHRONO("cuda:sources", + _CHECK_CUDA_SUCCESS("copying sources data to device", + cuMemcpyHtoD(source, + toSlice.data, + sliceSize)); + ) +#else + memcpy(source.data(), + toSlice.data, + sizeof(F) * sliceSize); +#endif + } @@ -80,16 +98,15 @@ namespace atrip { void sliceIntoBuffer(size_t it, CTF::Tensor &to, CTF::Tensor const& from) override { - const int Nv = this->sliceLength[0] - , No = this->sliceLength[1] - , a = this->rankMap.find({static_cast(Atrip::rank), it}); - ; + const int + Nv = this->sliceLength[0], + No = this->sliceLength[1], + a = this->rankMap.find({static_cast(Atrip::rank), it}); - sliceIntoVector( this->sources[it] - , to, {0, 0, 0}, {Nv, No, No} - , from, {a, 0, 0, 0}, {a+1, Nv, No, No} - ); + sliceIntoVector(this->sources[it], this->sliceSize, + to, {0, 0, 0}, {Nv, No, No}, + from, {a, 0, 0, 0}, {a+1, Nv, No, No}); } @@ -118,14 +135,13 @@ namespace atrip { void sliceIntoBuffer(size_t it, CTF::Tensor &to, CTF::Tensor const& from) override { - const int No = this->sliceLength[0] - , a = this->rankMap.find({static_cast(Atrip::rank), it}) - ; + const int + No = this->sliceLength[0], + a = this->rankMap.find({static_cast(Atrip::rank), it}); - sliceIntoVector( this->sources[it] - , to, {0, 0, 0}, {No, No, No} - , from, {0, 0, 0, a}, {No, No, No, a+1} - ); + sliceIntoVector(this->sources[it], this->sliceSize, + to, {0, 0, 0}, {No, No, No}, + from, {0, 0, 0, a}, {No, No, No, a+1}); } }; @@ -153,18 +169,17 @@ namespace atrip { void sliceIntoBuffer(size_t it, CTF::Tensor &to, CTF::Tensor const& from) override { - const int Nv = this->sliceLength[0] - , No = this->sliceLength[1] - , el = this->rankMap.find({static_cast(Atrip::rank), it}) - , a = el % Nv - , b = el / Nv - ; + const int + Nv = this->sliceLength[0], + No = this->sliceLength[1], + el = this->rankMap.find({static_cast(Atrip::rank), it}), + a = el % Nv, + b = el / Nv; - sliceIntoVector( this->sources[it] - , to, {0, 0}, {Nv, No} - , from, {a, b, 0, 0}, {a+1, b+1, Nv, No} - ); + sliceIntoVector(this->sources[it], this->sliceSize, + to, {0, 0}, {Nv, No}, + from, {a, b, 0, 0}, {a+1, b+1, Nv, No}); } @@ -191,17 +206,17 @@ namespace atrip { void sliceIntoBuffer(size_t it, CTF::Tensor &to, CTF::Tensor const& from) override { - const int Nv = from.lens[0] - , No = this->sliceLength[1] - , el = this->rankMap.find({static_cast(Atrip::rank), it}) - , a = el % Nv - , b = el / Nv - ; + const int + Nv = from.lens[0], + No = this->sliceLength[1], + el = this->rankMap.find({static_cast(Atrip::rank), it}), + a = el % Nv, + b = el / Nv; - sliceIntoVector( this->sources[it] - , to, {0, 0}, {No, No} - , from, {a, b, 0, 0}, {a+1, b+1, No, No} - ); + + sliceIntoVector(this->sources[it], this->sliceSize, + to, {0, 0}, {No, No}, + from, {a, b, 0, 0}, {a+1, b+1, No, No}); } @@ -231,17 +246,16 @@ namespace atrip { void sliceIntoBuffer(size_t it, CTF::Tensor &to, CTF::Tensor const& from) override { // TODO: maybe generalize this with ABHH - const int Nv = from.lens[0] - , No = this->sliceLength[1] - , el = this->rankMap.find({static_cast(Atrip::rank), it}) - , a = el % Nv - , b = el / Nv - ; + const int + Nv = from.lens[0], + No = this->sliceLength[1], + el = this->rankMap.find({static_cast(Atrip::rank), it}), + a = el % Nv, + b = el / Nv; - sliceIntoVector( this->sources[it] - , to, {0, 0}, {No, No} - , from, {a, b, 0, 0}, {a+1, b+1, No, No} - ); + sliceIntoVector(this->sources[it], this->sliceSize, + to, {0, 0}, {No, No}, + from, {a, b, 0, 0}, {a+1, b+1, No, No}); }