You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

elemwise_bmark.cpp 5.1 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. /**
  2. * \file dnn/test/x86/elemwise_bmark.cpp
  3. * MegEngine is Licensed under the Apache License, Version 2.0 (the "License")
  4. *
  5. * Copyright (c) 2014-2020 Megvii Inc. All rights reserved.
  6. *
  7. * Unless required by applicable law or agreed to in writing,
  8. * software distributed under the License is distributed on an
  9. * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. */
  11. #include "test/x86/fixture.h"
  12. #include "megdnn/oprs.h"
  13. #include "test/common/checker.h"
  14. #include "test/common/rng.h"
  15. #include "test/common/benchmarker.h"
  16. using namespace megdnn;
  17. using namespace test;
  18. #define TEST_IN_DIFF_DISTRUBUTION(proportion_of_inf, dataset_number) \
  19. max_val = 88.3762626647949f / (1 - proportion_of_inf); \
  20. UniformFloatRNG rng##dataset_number(0.f, max_val); \
  21. B.set_rng(0, &rng##dataset_number); \
  22. B.execs({{355600}, {}});
  23. TEST_F(X86, BENCHMARK_ELEM_EXP_BASED_OPTRS)
  24. {
  25. Benchmarker<ElemwiseForward> B(handle());
  26. using Mode = ElemwiseForward::Param::Mode;
  27. //UniformFloatWithZeroRNG rng(80, 100, 0.1);
  28. printf("Test Optr exp(x)\n");
  29. B.set_param(Mode::EXP);
  30. B.execs({{355600}, {}});
  31. float max_val = 0;
  32. TEST_IN_DIFF_DISTRUBUTION(0.25, 1)
  33. TEST_IN_DIFF_DISTRUBUTION(0.5, 2)
  34. TEST_IN_DIFF_DISTRUBUTION(0.75, 3)
  35. TEST_IN_DIFF_DISTRUBUTION(0.9999, 4)
  36. printf("Test Optr tanh(x)\n");
  37. B.set_param(Mode::TANH);
  38. B.execs({{355600}, {}});
  39. max_val = 0;
  40. TEST_IN_DIFF_DISTRUBUTION(0.25, 5)
  41. TEST_IN_DIFF_DISTRUBUTION(0.5, 6)
  42. TEST_IN_DIFF_DISTRUBUTION(0.75, 7)
  43. TEST_IN_DIFF_DISTRUBUTION(0.9999, 8)
  44. printf("Test Optr fast_tanh(x)\n");
  45. B.set_param(Mode::FAST_TANH);
  46. B.execs({{355600}, {}});
  47. printf("Test Optr sigmoid(x)\n");
  48. B.set_param(Mode::SIGMOID);
  49. B.execs({{355600}, {}});
  50. max_val = 0;
  51. TEST_IN_DIFF_DISTRUBUTION(0.25, 13)
  52. TEST_IN_DIFF_DISTRUBUTION(0.5, 14)
  53. TEST_IN_DIFF_DISTRUBUTION(0.75, 15)
  54. TEST_IN_DIFF_DISTRUBUTION(0.9999, 16)
  55. printf("Test Optr tanh_grad(x)\n");
  56. B.set_param(Mode::TANH_GRAD);
  57. B.execs({{355600}, {355600}, {}});
  58. printf("Test Optr fast_tanh_grad(x)\n");
  59. B.set_param(Mode::FAST_TANH_GRAD);
  60. B.execs({{355600}, {355600}, {}});
  61. }
  62. // 1. Unary
  63. #define BENCHMARK_UNARY(Optr, size) \
  64. printf("Test for %s \n", #Optr); \
  65. B.set_param(Mode::Optr); \
  66. B.execs({{4, 4, 4, 1+size/64, }, {}});
  67. // 2. Binary
  68. #define BENCHMARK_BINARY(Optr, size) \
  69. B.set_param(Mode::Optr); \
  70. B.execs({{size}, {size}, {}});
  71. #define BENCHMARK_BINARY_SCALAR(Optr, size) \
  72. B.set_param(Mode::Optr); \
  73. B.execs({{size}, {1}, {}});
  74. #define BENCHMARK_BINARY_1C11(Optr, chan) \
  75. B.set_param(Mode::Optr); \
  76. B.execs({{9, chan, 33, 127}, {1, chan, 1, 1}, {}});
  77. #define BENCHMARK_BINARY_ALL_KINDS(Optr, size) \
  78. printf("Test for %s \n", #Optr); \
  79. BENCHMARK_BINARY(Optr, size) \
  80. BENCHMARK_BINARY_SCALAR(Optr, size) \
  81. BENCHMARK_BINARY_1C11(Optr, (1+size/37719))
  82. // 3. Ternary
  83. #define BENCHMARK_TERNARY(Optr, size) \
  84. B.set_param(Mode::Optr); \
  85. B.execs({{size}, {size}, {size}, {}});
  86. #define BENCHMARK_TERNARY_SCALAR(Optr, size) \
  87. B.set_param(Mode::Optr); \
  88. B.execs({{size}, {size}, {1}, {}});
  89. #define BENCHMARK_TERNARY_1C11(Optr, chan) \
  90. B.set_param(Mode::Optr); \
  91. B.execs({{1, chan, 1, 1}, {9, chan, 33, 127}, {1, chan, 1, 1}, {}});
  92. #define BENCHMARK_TERNARY_ALL_KINDS(Optr, size) \
  93. printf("Test for %s \n", #Optr); \
  94. BENCHMARK_TERNARY(Optr, size) \
  95. BENCHMARK_TERNARY_SCALAR(Optr, size) \
  96. BENCHMARK_TERNARY_1C11(Optr, (size/37719))
  97. #define BENCHMARK_CASE_INT(size) \
  98. BENCHMARK_BINARY_ALL_KINDS(ADD, size) \
  99. BENCHMARK_BINARY_ALL_KINDS(SUB, size) \
  100. BENCHMARK_BINARY_ALL_KINDS(MUL, size) \
  101. BENCHMARK_BINARY_ALL_KINDS(TRUE_DIV, size) \
  102. BENCHMARK_BINARY_ALL_KINDS(MIN, size) \
  103. BENCHMARK_BINARY_ALL_KINDS(MAX, size) \
  104. BENCHMARK_UNARY(RELU, size) \
  105. BENCHMARK_UNARY(ABS, size) \
  106. BENCHMARK_BINARY_ALL_KINDS(FUSE_ADD_RELU, size) \
  107. BENCHMARK_TERNARY_ALL_KINDS(FUSE_MUL_ADD3, size)
  108. #define BENCHMARK_CASE_FLOAT(size) \
  109. BENCHMARK_CASE_INT(size) \
  110. BENCHMARK_BINARY_ALL_KINDS(FUSE_ADD_TANH, size) \
  111. BENCHMARK_BINARY_ALL_KINDS(FUSE_ADD_SIGMOID, size) \
  112. TEST_F(X86, BENCHMARK_ELEM_EVERY_DTYPE)
  113. {
  114. Benchmarker<ElemwiseForward> B(handle());
  115. using Mode = ElemwiseForward::Param::Mode;
  116. printf("\nTest case float32:\n");
  117. B.set_dtype(0, dtype::Float32());
  118. B.set_dtype(1, dtype::Float32());
  119. B.set_dtype(2, dtype::Float32());
  120. BENCHMARK_CASE_FLOAT(1556011)
  121. //printf("\nTest case int32:\n");
  122. //B.set_dtype(0, dtype::Int32());
  123. //B.set_dtype(1, dtype::Int32());
  124. //B.set_dtype(2, dtype::Int32());
  125. //BENCHMARK_CASE_INT(1556011)
  126. //printf("\nTest case int16:\n");
  127. //B.set_dtype(0, dtype::Int16());
  128. //B.set_dtype(1, dtype::Int16());
  129. //B.set_dtype(2, dtype::Int16());
  130. //BENCHMARK_CASE_INT(1556011)
  131. //printf("\nTest case int8:\n");
  132. //B.set_dtype(0, dtype::Int8());
  133. //B.set_dtype(1, dtype::Int8());
  134. //B.set_dtype(2, dtype::Int8());
  135. //BENCHMARK_CASE_INT(1556011)
  136. }

MegEngine 安装包中集成了使用 GPU 运行代码所需的 CUDA 环境,不用区分 CPU 和 GPU 版。 如果想要运行 GPU 程序,请确保机器本身配有 GPU 硬件设备并安装好驱动。 如果你想体验在云端 GPU 算力平台进行深度学习开发的感觉,欢迎访问 MegStudio 平台