From 0a72e4df949d889cc5ae492405f4ec9b9b829c11 Mon Sep 17 00:00:00 2001 From: Chao Liu Date: Fri, 16 Jul 2021 22:55:01 -0500 Subject: [PATCH] Change initialization method of tensor for iGEMM (#49) * change init method --- driver/conv_bwd_data_driver_v2.cpp | 50 +++++++++++++-------- driver/conv_driver_v2.cpp | 56 +++++++++++++----------- driver/conv_driver_v2_olc.cpp | 56 +++++++++++++----------- driver/include/host_tensor_generator.hpp | 18 ++++---- 4 files changed, 101 insertions(+), 79 deletions(-) diff --git a/driver/conv_bwd_data_driver_v2.cpp b/driver/conv_bwd_data_driver_v2.cpp index cc3274c7eb..4ae9c5c749 100644 --- a/driver/conv_bwd_data_driver_v2.cpp +++ b/driver/conv_bwd_data_driver_v2.cpp @@ -179,26 +179,38 @@ int main(int argc, char* argv[]) std::size_t num_thread = std::thread::hardware_concurrency(); - if(do_verification) + switch(init_method) { - switch(init_method) - { - case 0: - wei.GenerateTensorValue(GeneratorTensor_1{}, num_thread); - out.GenerateTensorValue(GeneratorTensor_1{}, num_thread); - break; - case 1: - wei.GenerateTensorValue(GeneratorTensor_2{-5, 5}, num_thread); - out.GenerateTensorValue(GeneratorTensor_1{}, num_thread); - break; - case 2: - wei.GenerateTensorValue(GeneratorTensor_1{}, num_thread); - out.GenerateTensorValue(GeneratorTensor_2{-5, 5}, num_thread); - break; - default: - wei.GenerateTensorValue(GeneratorTensor_2{-5, 5}, num_thread); - out.GenerateTensorValue(GeneratorTensor_2{-5, 5}, num_thread); - } + case 0: + // no initialization + break; + case 1: + out.GenerateTensorValue(GeneratorTensor_1{}, num_thread); + wei.GenerateTensorValue(GeneratorTensor_1{}, num_thread); + break; + case 2: + out.GenerateTensorValue(GeneratorTensor_1{}, num_thread); + wei.GenerateTensorValue(GeneratorTensor_2{-5, 5}, num_thread); + break; + case 3: + out.GenerateTensorValue(GeneratorTensor_2{-5, 5}, num_thread); + wei.GenerateTensorValue(GeneratorTensor_1{}, num_thread); + break; + case 4: + out.GenerateTensorValue(GeneratorTensor_2{-5, 5}, num_thread); + wei.GenerateTensorValue(GeneratorTensor_2{-5, 5}, num_thread); + break; + case 5: + out.GenerateTensorValue(GeneratorTensor_3{0.0, 1.0}, num_thread); + wei.GenerateTensorValue(GeneratorTensor_3{-0.5, 0.5}, num_thread); + break; + default: + out.GenerateTensorValue(GeneratorTensor_2{1, 5}, num_thread); + + auto gen_wei = [](auto... is) { + return GeneratorTensor_2{1, 5}(is...) * GeneratorTensor_Checkboard{}(is...); + }; + wei.GenerateTensorValue(gen_wei, num_thread); } auto f_make_for_device_nchw = [&]() { diff --git a/driver/conv_driver_v2.cpp b/driver/conv_driver_v2.cpp index 8f972ad37e..3b9fde9257 100644 --- a/driver/conv_driver_v2.cpp +++ b/driver/conv_driver_v2.cpp @@ -205,34 +205,38 @@ int main(int argc, char* argv[]) std::size_t num_thread = std::thread::hardware_concurrency(); - if(do_verification) + switch(init_method) { - switch(init_method) - { - case 0: - in.GenerateTensorValue(GeneratorTensor_1{}, num_thread); - wei.GenerateTensorValue(GeneratorTensor_1{}, num_thread); - break; - case 1: - in.GenerateTensorValue(GeneratorTensor_1{}, num_thread); - wei.GenerateTensorValue(GeneratorTensor_2{-5, 5}, num_thread); - break; - case 2: - in.GenerateTensorValue(GeneratorTensor_2{-5, 5}, num_thread); - wei.GenerateTensorValue(GeneratorTensor_1{}, num_thread); - break; - case 3: - in.GenerateTensorValue(GeneratorTensor_2{-5, 5}, num_thread); - wei.GenerateTensorValue(GeneratorTensor_2{-5, 5}, num_thread); - break; - default: - in.GenerateTensorValue(GeneratorTensor_2{1, 5}, num_thread); + case 0: + // no initialization + break; + case 1: + in.GenerateTensorValue(GeneratorTensor_1{}, num_thread); + wei.GenerateTensorValue(GeneratorTensor_1{}, num_thread); + break; + case 2: + in.GenerateTensorValue(GeneratorTensor_1{}, num_thread); + wei.GenerateTensorValue(GeneratorTensor_2{-5, 5}, num_thread); + break; + case 3: + in.GenerateTensorValue(GeneratorTensor_2{-5, 5}, num_thread); + wei.GenerateTensorValue(GeneratorTensor_1{}, num_thread); + break; + case 4: + in.GenerateTensorValue(GeneratorTensor_2{-5, 5}, num_thread); + wei.GenerateTensorValue(GeneratorTensor_2{-5, 5}, num_thread); + break; + case 5: + in.GenerateTensorValue(GeneratorTensor_3{0.0, 1.0}, num_thread); + wei.GenerateTensorValue(GeneratorTensor_3{-0.5, 0.5}, num_thread); + break; + default: + in.GenerateTensorValue(GeneratorTensor_2{1, 5}, num_thread); - auto gen_wei = [](auto... is) { - return GeneratorTensor_2{1, 5}(is...) * GeneratorTensor_Checkboard{}(is...); - }; - wei.GenerateTensorValue(gen_wei, num_thread); - } + auto gen_wei = [](auto... is) { + return GeneratorTensor_2{1, 5}(is...) * GeneratorTensor_Checkboard{}(is...); + }; + wei.GenerateTensorValue(gen_wei, num_thread); } auto f_make_for_device_nchw = [&]() { diff --git a/driver/conv_driver_v2_olc.cpp b/driver/conv_driver_v2_olc.cpp index 0b1c91c81b..d117dfdd31 100644 --- a/driver/conv_driver_v2_olc.cpp +++ b/driver/conv_driver_v2_olc.cpp @@ -152,34 +152,38 @@ int main(int argc, char* argv[]) std::size_t num_thread = std::thread::hardware_concurrency(); - if(do_verification) + switch(init_method) { - switch(init_method) - { - case 0: - in.GenerateTensorValue(GeneratorTensor_1{}, num_thread); - wei.GenerateTensorValue(GeneratorTensor_1{}, num_thread); - break; - case 1: - in.GenerateTensorValue(GeneratorTensor_1{}, num_thread); - wei.GenerateTensorValue(GeneratorTensor_2{-5, 5}, num_thread); - break; - case 2: - in.GenerateTensorValue(GeneratorTensor_2{-5, 5}, num_thread); - wei.GenerateTensorValue(GeneratorTensor_1{}, num_thread); - break; - case 3: - in.GenerateTensorValue(GeneratorTensor_2{-5, 5}, num_thread); - wei.GenerateTensorValue(GeneratorTensor_2{-5, 5}, num_thread); - break; - default: - in.GenerateTensorValue(GeneratorTensor_2{1, 5}, num_thread); + case 0: + // no initialization + break; + case 1: + in.GenerateTensorValue(GeneratorTensor_1{}, num_thread); + wei.GenerateTensorValue(GeneratorTensor_1{}, num_thread); + break; + case 2: + in.GenerateTensorValue(GeneratorTensor_1{}, num_thread); + wei.GenerateTensorValue(GeneratorTensor_2{-5, 5}, num_thread); + break; + case 3: + in.GenerateTensorValue(GeneratorTensor_2{-5, 5}, num_thread); + wei.GenerateTensorValue(GeneratorTensor_1{}, num_thread); + break; + case 4: + in.GenerateTensorValue(GeneratorTensor_2{-5, 5}, num_thread); + wei.GenerateTensorValue(GeneratorTensor_2{-5, 5}, num_thread); + break; + case 5: + in.GenerateTensorValue(GeneratorTensor_3{0.0, 1.0}, num_thread); + wei.GenerateTensorValue(GeneratorTensor_3{-0.5, 0.5}, num_thread); + break; + default: + in.GenerateTensorValue(GeneratorTensor_2{1, 5}, num_thread); - auto gen_wei = [](auto... is) { - return GeneratorTensor_2{1, 5}(is...) * GeneratorTensor_Checkboard{}(is...); - }; - wei.GenerateTensorValue(gen_wei, num_thread); - } + auto gen_wei = [](auto... is) { + return GeneratorTensor_2{1, 5}(is...) * GeneratorTensor_Checkboard{}(is...); + }; + wei.GenerateTensorValue(gen_wei, num_thread); } auto f_make_for_device_nchw = [&]() { diff --git a/driver/include/host_tensor_generator.hpp b/driver/include/host_tensor_generator.hpp index a62045a182..98192e066f 100644 --- a/driver/include/host_tensor_generator.hpp +++ b/driver/include/host_tensor_generator.hpp @@ -9,7 +9,7 @@ struct GeneratorTensor_1 int value = 1; template - double operator()(Is... is) + float operator()(Is... is) { return value; } @@ -21,29 +21,31 @@ struct GeneratorTensor_2 int max_value = 1; template - double operator()(Is...) + float operator()(Is...) { return (std::rand() % (max_value - min_value)) + min_value; } }; +template struct GeneratorTensor_3 { + T min_value = 0; + T max_value = 1; + template - double operator()(Is... is) + float operator()(Is...) { - std::array dims = {{static_cast(is)...}}; + float tmp = float(std::rand()) / float(RAND_MAX); - auto f_acc = [](auto a, auto b) { return 10 * a + b; }; - - return std::accumulate(dims.begin(), dims.end(), ck::index_t(0), f_acc); + return min_value + tmp * (max_value - min_value); } }; struct GeneratorTensor_Checkboard { template - double operator()(Ts... Xs) const + float operator()(Ts... Xs) const { std::array dims = {{static_cast(Xs)...}}; return std::accumulate(dims.begin(),