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.

cpuinfo.cpp 7.0 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. #include "src/common/utils.h"
  2. #if defined(MGB_ENABLE_CPUINFO_CHECK) && MGB_ENABLE_CPUINFO
  3. #include <cpuinfo.h>
  4. #include <inttypes.h>
  5. #include "gtest/gtest.h"
  6. namespace megdnn {
  7. namespace test {
  8. TEST(ARM_RUNTIME, CPUINFO_KIRIN980) {
  9. ASSERT_TRUE(cpuinfo_initialize());
  10. int right_soc = strcmp(cpuinfo_get_package(0)->name, "HiSilicon Kirin 980");
  11. if (!right_soc) {
  12. ASSERT_EQ(8, cpuinfo_get_processors_count());
  13. ASSERT_TRUE(cpuinfo_get_processors());
  14. ASSERT_TRUE(cpuinfo_has_arm_neon());
  15. ASSERT_TRUE(cpuinfo_has_arm_neon_fp16());
  16. ASSERT_TRUE(cpuinfo_has_arm_neon_fma());
  17. ASSERT_TRUE(cpuinfo_has_arm_neon_dot());
  18. for (uint32_t i = 0; i < cpuinfo_get_processors_count(); i++) {
  19. ASSERT_EQ(cpuinfo_get_core(i), cpuinfo_get_processor(i)->core);
  20. }
  21. for (uint32_t i = 0; i < cpuinfo_get_cores_count(); i++) {
  22. ASSERT_EQ(cpuinfo_vendor_arm, cpuinfo_get_core(i)->vendor);
  23. }
  24. for (uint32_t i = 0; i < cpuinfo_get_cores_count(); i++) {
  25. switch (i) {
  26. case 0:
  27. case 1:
  28. case 2:
  29. case 3:
  30. ASSERT_EQ(cpuinfo_uarch_cortex_a76, cpuinfo_get_core(i)->uarch);
  31. break;
  32. case 4:
  33. case 5:
  34. case 6:
  35. case 7:
  36. ASSERT_EQ(cpuinfo_uarch_cortex_a55, cpuinfo_get_core(i)->uarch);
  37. break;
  38. }
  39. }
  40. } else {
  41. printf("detect soc: %s ,skip test.\n", cpuinfo_get_package(0)->name);
  42. }
  43. }
  44. TEST(ARM_RUNTIME, CPUINFO_SDM8150) {
  45. ASSERT_TRUE(cpuinfo_initialize());
  46. int right_soc = strcmp(cpuinfo_get_package(0)->name, "Qualcomm Snapdragon 8150");
  47. if (!right_soc) {
  48. ASSERT_EQ(8, cpuinfo_get_processors_count());
  49. ASSERT_TRUE(cpuinfo_get_processors());
  50. ASSERT_TRUE(cpuinfo_has_arm_neon());
  51. ASSERT_TRUE(cpuinfo_has_arm_neon_fp16());
  52. ASSERT_TRUE(cpuinfo_has_arm_neon_fma());
  53. ASSERT_TRUE(cpuinfo_has_arm_neon_dot());
  54. ASSERT_FALSE(cpuinfo_has_arm_i8mm());
  55. for (uint32_t i = 0; i < cpuinfo_get_processors_count(); i++) {
  56. ASSERT_EQ(cpuinfo_get_core(i), cpuinfo_get_processor(i)->core);
  57. }
  58. for (uint32_t i = 0; i < cpuinfo_get_cores_count(); i++) {
  59. ASSERT_EQ(cpuinfo_vendor_arm, cpuinfo_get_core(i)->vendor);
  60. }
  61. for (uint32_t i = 0; i < cpuinfo_get_cores_count(); i++) {
  62. switch (i) {
  63. case 0:
  64. case 1:
  65. case 2:
  66. case 3:
  67. ASSERT_EQ(cpuinfo_uarch_cortex_a76, cpuinfo_get_core(i)->uarch);
  68. break;
  69. case 4:
  70. case 5:
  71. case 6:
  72. case 7:
  73. ASSERT_EQ(cpuinfo_uarch_cortex_a55, cpuinfo_get_core(i)->uarch);
  74. break;
  75. }
  76. }
  77. } else {
  78. printf("detect soc: %s ,skip test.\n", cpuinfo_get_package(0)->name);
  79. }
  80. }
  81. TEST(ARM_RUNTIME, CPUINFO_SDM660) {
  82. ASSERT_TRUE(cpuinfo_initialize());
  83. int right_soc = strcmp(cpuinfo_get_package(0)->name, "Qualcomm Snapdragon 660");
  84. if (!right_soc) {
  85. ASSERT_EQ(8, cpuinfo_get_processors_count());
  86. ASSERT_TRUE(cpuinfo_get_processors());
  87. ASSERT_TRUE(cpuinfo_has_arm_neon());
  88. ASSERT_TRUE(cpuinfo_has_arm_neon_fp16());
  89. ASSERT_TRUE(cpuinfo_has_arm_neon_fma());
  90. ASSERT_FALSE(cpuinfo_has_arm_neon_dot());
  91. for (uint32_t i = 0; i < cpuinfo_get_processors_count(); i++) {
  92. ASSERT_EQ(cpuinfo_get_core(i), cpuinfo_get_processor(i)->core);
  93. }
  94. for (uint32_t i = 0; i < cpuinfo_get_cores_count(); i++) {
  95. ASSERT_EQ(cpuinfo_vendor_arm, cpuinfo_get_core(i)->vendor);
  96. }
  97. for (uint32_t i = 0; i < cpuinfo_get_cores_count(); i++) {
  98. switch (i) {
  99. case 0:
  100. case 1:
  101. case 2:
  102. case 3:
  103. ASSERT_EQ(cpuinfo_uarch_cortex_a73, cpuinfo_get_core(i)->uarch);
  104. break;
  105. case 4:
  106. case 5:
  107. case 6:
  108. case 7:
  109. ASSERT_EQ(cpuinfo_uarch_cortex_a53, cpuinfo_get_core(i)->uarch);
  110. break;
  111. }
  112. }
  113. } else {
  114. printf("detect soc: %s ,skip test.\n", cpuinfo_get_package(0)->name);
  115. }
  116. }
  117. TEST(ARM_RUNTIME, CPUINFO_TAISHAN) {
  118. ASSERT_TRUE(cpuinfo_initialize());
  119. bool right_soc =
  120. cpuinfo_get_processors_count() == 96 &&
  121. cpuinfo_get_processor(0)->core->uarch == cpuinfo_uarch_taishan_v110;
  122. if (right_soc) {
  123. ASSERT_TRUE(cpuinfo_get_processors());
  124. ASSERT_TRUE(cpuinfo_has_arm_neon());
  125. ASSERT_TRUE(cpuinfo_has_arm_neon_fp16());
  126. ASSERT_TRUE(cpuinfo_has_arm_neon_fma());
  127. ASSERT_TRUE(cpuinfo_has_arm_neon_dot());
  128. ASSERT_FALSE(cpuinfo_has_arm_i8mm());
  129. for (uint32_t i = 0; i < cpuinfo_get_processors_count(); i++) {
  130. ASSERT_EQ(cpuinfo_get_core(i), cpuinfo_get_processor(i)->core);
  131. }
  132. for (uint32_t i = 0; i < cpuinfo_get_cores_count(); i++) {
  133. ASSERT_EQ(cpuinfo_vendor_huawei, cpuinfo_get_core(i)->vendor);
  134. }
  135. } else {
  136. printf("detect soc: %s ,skip test.\n", cpuinfo_get_package(0)->name);
  137. }
  138. }
  139. TEST(ARM_RUNTIME, CPUINFO_SDM8GEN1) {
  140. ASSERT_TRUE(cpuinfo_initialize());
  141. bool right_soc =
  142. cpuinfo_get_processors_count() == 8 &&
  143. cpuinfo_get_processor(0)->core->uarch == cpuinfo_uarch_cortex_x2 &&
  144. cpuinfo_get_processor(1)->core->uarch == cpuinfo_uarch_cortex_a710 &&
  145. cpuinfo_get_processor(7)->core->uarch == cpuinfo_uarch_cortex_a510;
  146. if (right_soc) {
  147. ASSERT_TRUE(cpuinfo_get_processors());
  148. ASSERT_TRUE(cpuinfo_has_arm_neon());
  149. ASSERT_TRUE(cpuinfo_has_arm_neon_fp16());
  150. ASSERT_TRUE(cpuinfo_has_arm_neon_fma());
  151. ASSERT_TRUE(cpuinfo_has_arm_neon_dot());
  152. //! Different devices which are the "right_soc" may support or don't support
  153. //! sve2, so comment the below code. When the SVE2 instruction set is used,
  154. //! please uncomment it and fix the bug.
  155. // ASSERT_FALSE(cpuinfo_has_arm_sve2());
  156. #if MEGDNN_AARCH64
  157. ASSERT_TRUE(cpuinfo_has_arm_i8mm());
  158. #endif
  159. for (uint32_t i = 0; i < cpuinfo_get_processors_count(); i++) {
  160. ASSERT_EQ(cpuinfo_get_core(i), cpuinfo_get_processor(i)->core);
  161. }
  162. for (uint32_t i = 0; i < cpuinfo_get_cores_count(); i++) {
  163. ASSERT_EQ(cpuinfo_vendor_arm, cpuinfo_get_core(i)->vendor);
  164. }
  165. } else {
  166. printf("detect soc: %s ,skip test.\n", cpuinfo_get_package(0)->name);
  167. }
  168. }
  169. } // namespace test
  170. } // namespace megdnn
  171. #endif
  172. // vim: syntax=cpp.doxygen