AUTH's THMMY "Parallel and distributed systems" course assignments.
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 
 
 
 

331 lignes
12 KiB

  1. /**
  2. * \file
  3. * \brief PDS HW2 tests
  4. *
  5. * \author
  6. * Christos Choutouridis AEM:8997
  7. * <cchoutou@ece.auth.gr>
  8. */
  9. #include <gtest/gtest.h>
  10. #include <algorithm> // rand/srand
  11. #include <ctime> // rand/srand
  12. #include "distsort.hpp"
  13. /* ================================== ascending ================================== */
  14. /*
  15. * bool ascending<SortMode::Bitonic>(mpi_id_t node, size_t depth);
  16. * depth 0 (the initial ascending pattern)
  17. */
  18. TEST(TdistBitonic_UT, ascending_test1) {
  19. EXPECT_EQ(ascending<SortMode::Bitonic>(0, 0), true);
  20. EXPECT_EQ(ascending<SortMode::Bitonic>(1, 0), false);
  21. EXPECT_EQ(ascending<SortMode::Bitonic>(2, 0), true);
  22. EXPECT_EQ(ascending<SortMode::Bitonic>(3, 0), false);
  23. EXPECT_EQ(ascending<SortMode::Bitonic>(4, 0), true);
  24. EXPECT_EQ(ascending<SortMode::Bitonic>(5, 0), false);
  25. EXPECT_EQ(ascending<SortMode::Bitonic>(6, 0), true);
  26. EXPECT_EQ(ascending<SortMode::Bitonic>(7, 0), false);
  27. for (mpi_id_t node = 0 ; node < 256 ; ++node) {
  28. EXPECT_EQ(ascending<SortMode::Bitonic>(node, 0), ((node % 2) ? false : true) );
  29. }
  30. }
  31. /*
  32. * bool ascending<SortMode::Bitonic>(mpi_id_t node, size_t depth);
  33. * depth 1
  34. */
  35. TEST(TdistBitonic_UT, ascending_test2) {
  36. EXPECT_EQ(ascending<SortMode::Bitonic>(0, 1), true);
  37. EXPECT_EQ(ascending<SortMode::Bitonic>(1, 1), true);
  38. EXPECT_EQ(ascending<SortMode::Bitonic>(2, 1), false);
  39. EXPECT_EQ(ascending<SortMode::Bitonic>(3, 1), false);
  40. EXPECT_EQ(ascending<SortMode::Bitonic>(4, 1), true);
  41. EXPECT_EQ(ascending<SortMode::Bitonic>(5, 1), true);
  42. EXPECT_EQ(ascending<SortMode::Bitonic>(6, 1), false);
  43. EXPECT_EQ(ascending<SortMode::Bitonic>(7, 1), false);
  44. for (mpi_id_t node = 0 ; node < 256 ; ++node) {
  45. EXPECT_EQ(ascending<SortMode::Bitonic>(2*node, 1), ((node % 2) ? false:true));
  46. EXPECT_EQ(ascending<SortMode::Bitonic>(2*node+1, 1), ((node % 2) ? false:true));
  47. }
  48. }
  49. /*
  50. * bool ascending<SortMode::Bitonic>(mpi_id_t node, size_t depth);
  51. * various depths
  52. */
  53. TEST(TdistBitonic_UT, ascending_test3) {
  54. // Depth = 3
  55. size_t ts_depth = 3;
  56. for (mpi_id_t n = 0 ; n < (1<<(ts_depth)) ; ++n)
  57. EXPECT_EQ(ascending<SortMode::Bitonic>(n, ts_depth), true);
  58. for (mpi_id_t n = (1<<(ts_depth)) ; n < 2*(1<<(ts_depth)) ; ++n)
  59. EXPECT_EQ(ascending<SortMode::Bitonic>(n, ts_depth), false);
  60. for (mpi_id_t n = 2*(1<<(ts_depth)) ; n < 3*(1<<(ts_depth)) ; ++n)
  61. EXPECT_EQ(ascending<SortMode::Bitonic>(n, ts_depth), true);
  62. for (mpi_id_t n = 3*(1<<(ts_depth)) ; n < 4*(1<<(ts_depth)) ; ++n)
  63. EXPECT_EQ(ascending<SortMode::Bitonic>(n, ts_depth), false);
  64. // Depth = 4
  65. ts_depth = 4;
  66. for (mpi_id_t n = 0L ; n < (1<<(ts_depth)) ; ++n)
  67. EXPECT_EQ(ascending<SortMode::Bitonic>(n, ts_depth), true);
  68. for (mpi_id_t n = (1<<(ts_depth)) ; n < 2*(1<<(ts_depth)) ; ++n)
  69. EXPECT_EQ(ascending<SortMode::Bitonic>(n, ts_depth), false);
  70. for (mpi_id_t n = 2*(1<<(ts_depth)) ; n < 3*(1<<(ts_depth)) ; ++n)
  71. EXPECT_EQ(ascending<SortMode::Bitonic>(n, ts_depth), true);
  72. for (mpi_id_t n = 3*(1<<(ts_depth)) ; n < 4*(1<<(ts_depth)) ; ++n)
  73. EXPECT_EQ(ascending<SortMode::Bitonic>(n, ts_depth), false);
  74. // Depth = 8
  75. ts_depth = 8;
  76. for (mpi_id_t n = 0L ; n < (1<<(ts_depth)) ; ++n)
  77. EXPECT_EQ(ascending<SortMode::Bitonic>(n, ts_depth), true);
  78. for (mpi_id_t n = (1<<(ts_depth)) ; n < 2*(1<<(ts_depth)) ; ++n)
  79. EXPECT_EQ(ascending<SortMode::Bitonic>(n, ts_depth), false);
  80. for (mpi_id_t n = 2*(1<<(ts_depth)) ; n < 3*(1<<(ts_depth)) ; ++n)
  81. EXPECT_EQ(ascending<SortMode::Bitonic>(n, ts_depth), true);
  82. for (mpi_id_t n = 3*(1<<(ts_depth)) ; n < 4*(1<<(ts_depth)) ; ++n)
  83. EXPECT_EQ(ascending<SortMode::Bitonic>(n, ts_depth), false);
  84. }
  85. /* ================================== partner ================================== */
  86. /*
  87. * mpi_id_t partner<SortMode::Bitonic>(mpi_id_t node, size_t step);
  88. * step = 0
  89. */
  90. TEST(TdistBitonic_UT, partner_test1) {
  91. EXPECT_EQ(partner<SortMode::Bitonic>(0, 0), 1);
  92. EXPECT_EQ(partner<SortMode::Bitonic>(1, 0), 0);
  93. EXPECT_EQ(partner<SortMode::Bitonic>(2, 0), 3);
  94. EXPECT_EQ(partner<SortMode::Bitonic>(3, 0), 2);
  95. EXPECT_EQ(partner<SortMode::Bitonic>(4, 0), 5);
  96. EXPECT_EQ(partner<SortMode::Bitonic>(5, 0), 4);
  97. EXPECT_EQ(partner<SortMode::Bitonic>(6, 0), 7);
  98. EXPECT_EQ(partner<SortMode::Bitonic>(7, 0), 6);
  99. for (mpi_id_t node = 0 ; node < 256 ; ++node) {
  100. EXPECT_EQ(partner<SortMode::Bitonic>(node, 0), (node % 2) ? node-1 : node+1);
  101. }
  102. }
  103. /*
  104. * mpi_id_t partner<SortMode::Bitonic>(mpi_id_t node, size_t step);
  105. * step = 1
  106. */
  107. TEST(TdistBitonic_UT, partner_test2) {
  108. EXPECT_EQ(partner<SortMode::Bitonic>(0, 1), 2);
  109. EXPECT_EQ(partner<SortMode::Bitonic>(1, 1), 3);
  110. EXPECT_EQ(partner<SortMode::Bitonic>(2, 1), 0);
  111. EXPECT_EQ(partner<SortMode::Bitonic>(3, 1), 1);
  112. EXPECT_EQ(partner<SortMode::Bitonic>(4, 1), 6);
  113. EXPECT_EQ(partner<SortMode::Bitonic>(5, 1), 7);
  114. EXPECT_EQ(partner<SortMode::Bitonic>(6, 1), 4);
  115. EXPECT_EQ(partner<SortMode::Bitonic>(7, 1), 5);
  116. for (mpi_id_t n1 = 0 ; n1 < 256 ; n1 += 2) {
  117. auto n2 = n1 + 1;
  118. EXPECT_EQ(partner<SortMode::Bitonic>(n1, 1), ((n1 % 4) ? n1-2 : n1+2));
  119. EXPECT_EQ(partner<SortMode::Bitonic>(n2, 1), ((n1 % 4) ? n2-2 : n2+2));
  120. }
  121. }
  122. /*
  123. * mpi_id_t partner(mpi_id_t node, size_t step);
  124. * various steps
  125. */
  126. TEST(TdistBitonic_UT, partner_test3) {
  127. // step = 2
  128. size_t ts_step = 2;
  129. for (mpi_id_t n1 = 0 ; n1 < 256 ; n1 += 4) {
  130. auto n2 = n1 + 1;
  131. auto n3 = n1 + 2;
  132. auto n4 = n1 + 3;
  133. EXPECT_EQ(partner<SortMode::Bitonic>(n1, ts_step), ((n1 % 8) ? n1-4 : n1+4));
  134. EXPECT_EQ(partner<SortMode::Bitonic>(n2, ts_step), ((n1 % 8) ? n2-4 : n2+4));
  135. EXPECT_EQ(partner<SortMode::Bitonic>(n3, ts_step), ((n1 % 8) ? n3-4 : n3+4));
  136. EXPECT_EQ(partner<SortMode::Bitonic>(n4, ts_step), ((n1 % 8) ? n4-4 : n4+4));
  137. }
  138. // step = 3
  139. ts_step = 3;
  140. for (mpi_id_t n1 = 0 ; n1 < 256 ; n1 += 8) {
  141. auto n2 = n1 + 1;
  142. auto n3 = n1 + 2;
  143. auto n4 = n1 + 3;
  144. auto n5 = n1 + 4;
  145. auto n6 = n1 + 5;
  146. auto n7 = n1 + 6;
  147. auto n8 = n1 + 7;
  148. EXPECT_EQ(partner<SortMode::Bitonic>(n1, ts_step), ((n1 % 16) ? n1-8 : n1+8));
  149. EXPECT_EQ(partner<SortMode::Bitonic>(n2, ts_step), ((n1 % 16) ? n2-8 : n2+8));
  150. EXPECT_EQ(partner<SortMode::Bitonic>(n3, ts_step), ((n1 % 16) ? n3-8 : n3+8));
  151. EXPECT_EQ(partner<SortMode::Bitonic>(n4, ts_step), ((n1 % 16) ? n4-8 : n4+8));
  152. EXPECT_EQ(partner<SortMode::Bitonic>(n5, ts_step), ((n1 % 16) ? n5-8 : n5+8));
  153. EXPECT_EQ(partner<SortMode::Bitonic>(n6, ts_step), ((n1 % 16) ? n6-8 : n6+8));
  154. EXPECT_EQ(partner<SortMode::Bitonic>(n7, ts_step), ((n1 % 16) ? n7-8 : n7+8));
  155. EXPECT_EQ(partner<SortMode::Bitonic>(n8, ts_step), ((n1 % 16) ? n8-8 : n8+8));
  156. }
  157. // step = 4
  158. ts_step = 4;
  159. for (mpi_id_t n1 = 0 ; n1 < 256 ; n1 += 16) {
  160. auto n2 = n1 + 1;
  161. auto n3 = n1 + 2;
  162. auto n4 = n1 + 3;
  163. auto n5 = n1 + 4;
  164. auto n6 = n1 + 5;
  165. auto n7 = n1 + 6;
  166. auto n8 = n1 + 7;
  167. auto n9 = n1 + 8;
  168. auto n10 = n1 + 9;
  169. auto n11 = n1 + 10;
  170. auto n12 = n1 + 11;
  171. auto n13 = n1 + 12;
  172. auto n14 = n1 + 13;
  173. auto n15 = n1 + 14;
  174. auto n16 = n1 + 15;
  175. EXPECT_EQ(partner<SortMode::Bitonic>(n1, ts_step), ((n1 % 32) ? n1-16 : n1+16));
  176. EXPECT_EQ(partner<SortMode::Bitonic>(n2, ts_step), ((n1 % 32) ? n2-16 : n2+16));
  177. EXPECT_EQ(partner<SortMode::Bitonic>(n3, ts_step), ((n1 % 32) ? n3-16 : n3+16));
  178. EXPECT_EQ(partner<SortMode::Bitonic>(n4, ts_step), ((n1 % 32) ? n4-16 : n4+16));
  179. EXPECT_EQ(partner<SortMode::Bitonic>(n5, ts_step), ((n1 % 32) ? n5-16 : n5+16));
  180. EXPECT_EQ(partner<SortMode::Bitonic>(n6, ts_step), ((n1 % 32) ? n6-16 : n6+16));
  181. EXPECT_EQ(partner<SortMode::Bitonic>(n7, ts_step), ((n1 % 32) ? n7-16 : n7+16));
  182. EXPECT_EQ(partner<SortMode::Bitonic>(n8, ts_step), ((n1 % 32) ? n8-16 : n8+16));
  183. EXPECT_EQ(partner<SortMode::Bitonic>(n9, ts_step), ((n1 % 32) ? n9-16 : n9+16));
  184. EXPECT_EQ(partner<SortMode::Bitonic>(n10, ts_step), ((n1 % 32) ? n10-16 : n10+16));
  185. EXPECT_EQ(partner<SortMode::Bitonic>(n11, ts_step), ((n1 % 32) ? n11-16 : n11+16));
  186. EXPECT_EQ(partner<SortMode::Bitonic>(n12, ts_step), ((n1 % 32) ? n12-16 : n12+16));
  187. EXPECT_EQ(partner<SortMode::Bitonic>(n13, ts_step), ((n1 % 32) ? n13-16 : n13+16));
  188. EXPECT_EQ(partner<SortMode::Bitonic>(n14, ts_step), ((n1 % 32) ? n14-16 : n14+16));
  189. EXPECT_EQ(partner<SortMode::Bitonic>(n15, ts_step), ((n1 % 32) ? n15-16 : n15+16));
  190. EXPECT_EQ(partner<SortMode::Bitonic>(n16, ts_step), ((n1 % 32) ? n16-16 : n16+16));
  191. }
  192. }
  193. /* ================================== keepSmall ================================== */
  194. /*
  195. * bool keepSmall(mpi_id_t node, mpi_id_t partner, size_t depth);
  196. * Throw check (Not assert - ASSERT_DEATH)
  197. */
  198. TEST(TdistBitonic_UT, keepsmall_test1) {
  199. // node and partner must differ or else ...
  200. EXPECT_THROW(keepSmall<SortMode::Bitonic>(0, 0, 0), std::runtime_error);
  201. EXPECT_THROW(keepSmall<SortMode::Bitonic>(1, 1, 42), std::runtime_error);
  202. EXPECT_THROW(keepSmall<SortMode::Bitonic>(7, 7, 42), std::runtime_error);
  203. }
  204. /*
  205. * bool keepsmall(mpi_id_t node, mpi_id_t partner, size_t depth);
  206. *
  207. * depth: 1 | step: 0 | partner: [1, 0, 3, 2, 5, 4, 7, 6] | keepSmall: Bool[1, 0, 0, 1, 1, 0, 0, 1]
  208. */
  209. TEST(TdistBitonic_UT, keepsmall_test2) {
  210. size_t ts_depth = 1;
  211. mpi_id_t ts_partner[] = {1, 0, 3, 2, 5, 4, 7, 6};
  212. bool ts_expected[] = {1, 0, 0, 1, 1, 0, 0, 1};
  213. for (mpi_id_t node = 0 ; node < 8 ; ++node ) {
  214. EXPECT_EQ(ts_expected[node], keepSmall<SortMode::Bitonic>(node, ts_partner[node], ts_depth));
  215. }
  216. }
  217. /*
  218. * bool keepsmall(mpi_id_t node, mpi_id_t partner, size_t depth);
  219. *
  220. * depth: 2 | step: 1 | partner: [2, 3, 0, 1, 6, 7, 4, 5] | keepSmall: Bool[1, 1, 0, 0, 0, 0, 1, 1]
  221. */
  222. TEST(TdistBitonic_UT, keepsmall_test3) {
  223. size_t ts_depth = 2;
  224. mpi_id_t ts_partner[] = {2, 3, 0, 1, 6, 7, 4, 5};
  225. bool ts_expected[] = {1, 1, 0, 0, 0, 0, 1, 1};
  226. for (mpi_id_t node = 0 ; node < 8 ; ++node ) {
  227. EXPECT_EQ(ts_expected[node], keepSmall<SortMode::Bitonic>(node, ts_partner[node], ts_depth));
  228. }
  229. }
  230. /*
  231. * bool keepsmall(mpi_id_t node, mpi_id_t partner, size_t depth);
  232. *
  233. * depth: 2 | step: 0 | partner: [1, 0, 3, 2, 5, 4, 7, 6] | keepSmall: Bool[1, 0, 1, 0, 0, 1, 0, 1]
  234. */
  235. TEST(TdistBitonic_UT, keepsmall_test4) {
  236. size_t ts_depth = 2;
  237. mpi_id_t ts_partner[] = {1, 0, 3, 2, 5, 4, 7, 6};
  238. bool ts_expected[] = {1, 0, 1, 0, 0, 1, 0, 1};
  239. for (mpi_id_t node = 0 ; node < 8 ; ++node ) {
  240. EXPECT_EQ(ts_expected[node], keepSmall<SortMode::Bitonic>(node, ts_partner[node], ts_depth));
  241. }
  242. }
  243. /*
  244. * bool keepSmall(mpi_id_t node, mpi_id_t partner, size_t depth);
  245. *
  246. * depth: 3 | step: 2 | partner: [4, 5, 6, 7, 0, 1, 2, 3] | keepsmall: Bool[1, 1, 1, 1, 0, 0, 0, 0]
  247. */
  248. TEST(TdistBitonic_UT, keepsmall_test5) {
  249. size_t ts_depth = 3;
  250. mpi_id_t ts_partner[] = {4, 5, 6, 7, 0, 1, 2, 3};
  251. bool ts_expected[] = {1, 1, 1, 1, 0, 0, 0, 0};
  252. for (mpi_id_t node = 0 ; node < 8 ; ++node ) {
  253. EXPECT_EQ(ts_expected[node], keepSmall<SortMode::Bitonic>(node, ts_partner[node], ts_depth));
  254. }
  255. }
  256. /*
  257. * bool keepSmall(mpi_id_t node, mpi_id_t partner, size_t depth);
  258. *
  259. * depth: 3 | step: 1 | partner: [2, 3, 0, 1, 6, 7, 4, 5] | keepsmall: Bool[1, 1, 0, 0, 1, 1, 0, 0]
  260. */
  261. TEST(TdistBitonic_UT, keepsmall_test6) {
  262. size_t ts_depth = 3;
  263. mpi_id_t ts_partner[] = {2, 3, 0, 1, 6, 7, 4, 5};
  264. bool ts_expected[] = {1, 1, 0, 0, 1, 1, 0, 0};
  265. for (mpi_id_t node = 0 ; node < 8 ; ++node ) {
  266. EXPECT_EQ(ts_expected[node], keepSmall<SortMode::Bitonic>(node, ts_partner[node], ts_depth));
  267. }
  268. }
  269. /*
  270. * bool keepSmall(mpi_id_t node, mpi_id_t partner, size_t depth);
  271. *
  272. * depth: 3 | step: 0 | partner: [1, 0, 3, 2, 5, 4, 7, 6] | keepsmall: Bool[1, 0, 1, 0, 1, 0, 1, 0]
  273. */
  274. TEST(TdistBitonic_UT, keepsmall_test7) {
  275. size_t ts_depth = 3;
  276. mpi_id_t ts_partner[] = {1, 0, 3, 2, 5, 4, 7, 6};
  277. bool ts_expected[] = {1, 0, 1, 0, 1, 0, 1, 0};
  278. for (mpi_id_t node = 0 ; node < 8 ; ++node ) {
  279. EXPECT_EQ(ts_expected[node], keepSmall<SortMode::Bitonic>(node, ts_partner[node], ts_depth));
  280. }
  281. }