From e106285994f5fc1b7aaa4871b835da2d507c1587 Mon Sep 17 00:00:00 2001 From: Semen Tarlinskii Date: Mon, 15 Jan 2024 14:33:26 +0300 Subject: [PATCH] test commit --- .../yql/utils/simd/exec/add_columns/main.cpp | 72 +++++++++++++++++++ .../yql/utils/simd/exec/add_columns/ya.make | 13 ++++ ydb/library/yql/utils/simd/exec/ya.make | 1 + ydb/library/yql/utils/simd/simd_avx2.h | 4 ++ 4 files changed, 90 insertions(+) create mode 100644 ydb/library/yql/utils/simd/exec/add_columns/main.cpp create mode 100644 ydb/library/yql/utils/simd/exec/add_columns/ya.make diff --git a/ydb/library/yql/utils/simd/exec/add_columns/main.cpp b/ydb/library/yql/utils/simd/exec/add_columns/main.cpp new file mode 100644 index 000000000000..f4155d9cc5f2 --- /dev/null +++ b/ydb/library/yql/utils/simd/exec/add_columns/main.cpp @@ -0,0 +1,72 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +const size_t size = 64e5; + +template +inline double GetSum(std::vector>& columns, std::vector& result) { + const size_t SIZE_OF_TYPE = 256 / (sizeof(T) * 8); + const size_t align_size = columns[0].size(); + + std::chrono::steady_clock::time_point start = std::chrono::steady_clock::now(); + + for (size_t i = 0; i < align_size; i += SIZE_OF_TYPE) { + NSimd::NAVX2::TSimd8 final_register(&columns[0][i]); + + for (size_t j = 1; j < columns.size(); ++j) { + final_register.Add64(&columns[j][i]); + } + + final_register.Store(&result[i]); + } + + std::chrono::steady_clock::time_point finish = std::chrono::steady_clock::now(); + + return std::chrono::duration_cast(finish - start).count(); + +} + +double StandartAdding(std::vector>& columns, std::vector& result) { + std::chrono::steady_clock::time_point start = std::chrono::steady_clock::now(); + + for (size_t j = 0; j < columns[0].size(); ++j) { + + for (size_t i = 0; i < columns[i].size(); ++i) { + result[j] += columns[i][j]; + } + + } + std::chrono::steady_clock::time_point finish = std::chrono::steady_clock::now(); + + return std::chrono::duration_cast(finish - start).count(); +} + +int main() { + std::vector> vec1(10, std::vector(size, 1e12 + 3)); + + std::vector result1(size, 0); + std::vector result2(size, 0); + + double ans1 = GetSum(vec1, result1); + double ans2 = StandartAdding(vec1, result2); + + for (size_t i = 0; i < result2.size(); ++i) { + if (result2[i] != result1[i]) { + Cerr << "something went wrong..."; + return 0; + } + } + + Cerr << "The results are the same. Let's compare times:\n"; + Cerr << "Time, using AVX2: " << ans1 << " ms\n"; + Cerr << "Time, using standart adding: " << ans2 << "ms"; +} \ No newline at end of file diff --git a/ydb/library/yql/utils/simd/exec/add_columns/ya.make b/ydb/library/yql/utils/simd/exec/add_columns/ya.make new file mode 100644 index 000000000000..14b019febcc7 --- /dev/null +++ b/ydb/library/yql/utils/simd/exec/add_columns/ya.make @@ -0,0 +1,13 @@ +OWNER(g:yql) + +PROGRAM(add_columns) + +SRCS(main.cpp) + +SIZE(MEDIUM) + +CFLAGS(-mavx2) + +PEERDIR(ydb/library/yql/utils/simd) + +END() diff --git a/ydb/library/yql/utils/simd/exec/ya.make b/ydb/library/yql/utils/simd/exec/ya.make index c36eb9197722..e86fb715d641 100644 --- a/ydb/library/yql/utils/simd/exec/ya.make +++ b/ydb/library/yql/utils/simd/exec/ya.make @@ -28,4 +28,5 @@ RECURSE( pack_tuple tuples_to_bucket stream_store + add_columns ) \ No newline at end of file diff --git a/ydb/library/yql/utils/simd/simd_avx2.h b/ydb/library/yql/utils/simd/simd_avx2.h index 319e201cdadf..27cbeb4a50ca 100644 --- a/ydb/library/yql/utils/simd/simd_avx2.h +++ b/ydb/library/yql/utils/simd/simd_avx2.h @@ -77,6 +77,10 @@ struct TSimd8 { crc = _mm_crc32_u64(crc, *((ui64*) &this->Value + 3)); return crc; } + + inline void Add64(const TSimd8& another) { + Value = _mm256_add_epi64(Value, another.Value); + } inline int ToBitMask() const { return _mm256_movemask_epi8(this->Value);