diff --git a/ydb/library/yql/utils/simd/exec/runtime_dispatching/AVX2_algo/avx2_algo.cpp b/ydb/library/yql/utils/simd/exec/runtime_dispatching/AVX2_algo/avx2_algo.cpp new file mode 100644 index 000000000000..048653ab8143 --- /dev/null +++ b/ydb/library/yql/utils/simd/exec/runtime_dispatching/AVX2_algo/avx2_algo.cpp @@ -0,0 +1,9 @@ +#include +#include +#include + +template<> +THolder Perfomancer::Create() { + Cerr << "AVXTrait"; + return MakeHolder>(); +} \ No newline at end of file diff --git a/ydb/library/yql/utils/simd/exec/runtime_dispatching/AVX2_algo/ya.make b/ydb/library/yql/utils/simd/exec/runtime_dispatching/AVX2_algo/ya.make new file mode 100644 index 000000000000..d435fa73030a --- /dev/null +++ b/ydb/library/yql/utils/simd/exec/runtime_dispatching/AVX2_algo/ya.make @@ -0,0 +1,9 @@ +LIBRARY() + +OWNER(g:yql) + +CFLAGS(-mavx2) + +SRCS(avx2_algo.cpp) + +END() \ No newline at end of file diff --git a/ydb/library/yql/utils/simd/exec/runtime_dispatching/Fallback_algo/fallback_algo.cpp b/ydb/library/yql/utils/simd/exec/runtime_dispatching/Fallback_algo/fallback_algo.cpp new file mode 100644 index 000000000000..ae60677a6541 --- /dev/null +++ b/ydb/library/yql/utils/simd/exec/runtime_dispatching/Fallback_algo/fallback_algo.cpp @@ -0,0 +1,7 @@ +#include + +template<> +THolder Perfomancer::Create() { + Cerr << "FallbackTrait"; + return MakeHolder>(); +} \ No newline at end of file diff --git a/ydb/library/yql/utils/simd/exec/runtime_dispatching/Fallback_algo/ya.make b/ydb/library/yql/utils/simd/exec/runtime_dispatching/Fallback_algo/ya.make new file mode 100644 index 000000000000..42e95e1c6581 --- /dev/null +++ b/ydb/library/yql/utils/simd/exec/runtime_dispatching/Fallback_algo/ya.make @@ -0,0 +1,7 @@ +LIBRARY() + +OWNER(g:yql) + +SRCS(fallback_algo.cpp) + +END() \ No newline at end of file diff --git a/ydb/library/yql/utils/simd/exec/runtime_dispatching/SSE42_algo/sse42_algo.cpp b/ydb/library/yql/utils/simd/exec/runtime_dispatching/SSE42_algo/sse42_algo.cpp new file mode 100644 index 000000000000..921bbc4fc2cf --- /dev/null +++ b/ydb/library/yql/utils/simd/exec/runtime_dispatching/SSE42_algo/sse42_algo.cpp @@ -0,0 +1,8 @@ +#include +#include + +template<> +THolder Perfomancer::Create() { + Cerr << "SSETrait"; + return MakeHolder>(); +} \ No newline at end of file diff --git a/ydb/library/yql/utils/simd/exec/runtime_dispatching/SSE42_algo/ya.make b/ydb/library/yql/utils/simd/exec/runtime_dispatching/SSE42_algo/ya.make new file mode 100644 index 000000000000..e08bf55a60aa --- /dev/null +++ b/ydb/library/yql/utils/simd/exec/runtime_dispatching/SSE42_algo/ya.make @@ -0,0 +1,9 @@ +LIBRARY() + +OWNER(g:yql) + +CFLAGS(-msse4.2) + +SRCS(sse42_algo.cpp) + +END() \ No newline at end of file diff --git a/ydb/library/yql/utils/simd/exec/runtime_dispatching/algo.h b/ydb/library/yql/utils/simd/exec/runtime_dispatching/algo.h new file mode 100644 index 000000000000..10bdc4860d91 --- /dev/null +++ b/ydb/library/yql/utils/simd/exec/runtime_dispatching/algo.h @@ -0,0 +1,92 @@ +#include "util/system/cpu_id.h" +#include +#include +#include +#include + +using vl = std::vector; +using vvl = std::vector>; + +template typename Intrinsic> +struct TTrait { + static constexpr int Size = RegisterSize; +}; + +using AVX2Trait = NSimd::NAVX2::TSimd8; + +using SSE42Trait = NSimd::NSSE42::TSimd8; + +using FallbackTrait = NSimd::NFallback::FallbackTrait; + +struct Perfomancer { + + Perfomancer() = default; + + struct Interface { + + virtual ~Interface() = default; + + inline virtual void Add(vvl& columns, vl& result) { + + // to avoid clang(-Wunused-parameter) + columns[0]; + result[0]; + } + + }; + + + template + struct Algo : Interface { + + Algo() {} + + inline void Add(vvl& columns, vl& result) override { + std::vector Registers(columns.size()); + + for (size_t j = 0; j < result.size(); j += Trait::Size) { + + for (size_t i = 0; i < columns.size(); ++i) { + Registers[i] = Trait(&columns[i][j]); + } + + for (size_t i = 1; i < columns.size(); ++i) { + Registers[i] += Registers[i - 1]; + } + + Registers.back().Store(&result[j]); + } + } + + ~Algo() = default; + }; + + template + inline THolder Create() { + return MakeHolder(); + } + +}; + +template<> +THolder Perfomancer::Create(); + +template<> +THolder Perfomancer::Create(); + +template<> +THolder Perfomancer::Create(); + +template +auto ChooseTrait(TFactory& factory) { + + if (NX86::HaveAVX2()) { + return factory.template Create(); + + } else if (NX86::HaveSSE42()) { + return factory.template Create(); + + } + + return factory.template Create(); +} diff --git a/ydb/library/yql/utils/simd/exec/runtime_dispatching/main/main.cpp b/ydb/library/yql/utils/simd/exec/runtime_dispatching/main/main.cpp new file mode 100644 index 000000000000..f3de913dc9cc --- /dev/null +++ b/ydb/library/yql/utils/simd/exec/runtime_dispatching/main/main.cpp @@ -0,0 +1,13 @@ +#include + +int main() { + + std::vector> columns(10, std::vector(64e6, 1e8)); + std::vector result(64e6); + + Perfomancer perfomancer; + + auto worker = ChooseTrait(perfomancer); + + worker->Add(columns, result); +} \ No newline at end of file diff --git a/ydb/library/yql/utils/simd/exec/runtime_dispatching/main/ya.make b/ydb/library/yql/utils/simd/exec/runtime_dispatching/main/ya.make new file mode 100644 index 000000000000..cdf26a14805d --- /dev/null +++ b/ydb/library/yql/utils/simd/exec/runtime_dispatching/main/ya.make @@ -0,0 +1,9 @@ +OWNER(g:yql) + +PROGRAM() + +SRCS(main.cpp) + +PEERDIR(ydb/library/yql/utils/simd/exec/runtime_dispatching) + +END() \ No newline at end of file diff --git a/ydb/library/yql/utils/simd/exec/runtime_dispatching/ya.make b/ydb/library/yql/utils/simd/exec/runtime_dispatching/ya.make new file mode 100644 index 000000000000..643c72cd6441 --- /dev/null +++ b/ydb/library/yql/utils/simd/exec/runtime_dispatching/ya.make @@ -0,0 +1,19 @@ +OWNER(g:yql) + +LIBRARY() + +PEERDIR( + ydb/library/yql/utils/simd + ydb/library/yql/utils/simd/exec/runtime_dispatching/AVX2_algo + ydb/library/yql/utils/simd/exec/runtime_dispatching/SSE42_algo + ydb/library/yql/utils/simd/exec/runtime_dispatching/Fallback_algo +) + +END() + +RECURSE( + AVX2_algo + SSE42_algo + Fallback_algo + main +) \ No newline at end of file