ORExpand.cpp 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #include "ORExpand.hpp"
  2. #ifdef TEST_OREXPAND
  3. void test_ORExpand()
  4. {
  5. size_t block_size = 48;
  6. uint32_t N = 16;
  7. uint32_t dest_specified[] = {0, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14};
  8. size_t dest_specified_len = sizeof(dest_specified)/sizeof(uint32_t);
  9. unsigned char *buf = new unsigned char[N*block_size];
  10. uint32_t *dest = new uint32_t[N];
  11. for (size_t i=0;i<dest_specified_len;++i) {
  12. dest[i] = dest_specified[i];
  13. }
  14. for (size_t i=dest_specified_len;i<N;++i) {
  15. dest[i] = 0xffffffff;
  16. }
  17. for (size_t i=0;i<N;++i) {
  18. for (size_t j=0;j<block_size;j+=2) {
  19. buf[i*block_size+j] = (unsigned char)i;
  20. buf[i*block_size+j+1] = (unsigned char)j/2;
  21. }
  22. }
  23. ORExpand<OSWAP_16X>(buf, dest, block_size, N);
  24. for(size_t i=0;i<N;++i) {
  25. printf("%2d ", i);
  26. if (dest[i] == 0xffffffff) {
  27. printf("PD ");
  28. } else {
  29. printf("%2d ", dest[i]);
  30. }
  31. for (size_t j=0;j<block_size;++j) {
  32. printf("%02x", buf[i*block_size+j]);
  33. }
  34. printf("\n");
  35. }
  36. delete[] buf;
  37. delete[] dest;
  38. }
  39. void test_ORExpand_parallel(threadid_t nthreads)
  40. {
  41. size_t block_size = 384;
  42. uint32_t N = 500000;
  43. unsigned char *buf = new unsigned char[N*block_size];
  44. uint32_t *dest = new uint32_t[N];
  45. uint32_t next_dest = 0;
  46. for (uint32_t i=0;i<N;++i) {
  47. // Randomly decide whether i is real or dummy
  48. bool keep = getRandomBit();
  49. if (keep) {
  50. dest[next_dest] = i;
  51. ++next_dest;
  52. }
  53. }
  54. for (uint32_t i=next_dest;i<N;++i) {
  55. dest[i] = 0xffffffff;
  56. }
  57. for (size_t i=0;i<N;++i) {
  58. for (size_t j=0;j<block_size;j+=2) {
  59. buf[i*block_size+j] = (unsigned char)i;
  60. buf[i*block_size+j+1] = (unsigned char)j/2;
  61. }
  62. }
  63. ORExpand_parallel<OSWAP_16X>(buf, dest, block_size, N, nthreads);
  64. for(uint32_t i=0;i<N;++i) {
  65. assert(dest[i] == 0xffffffff || dest[i] == i);
  66. if (N < 200) {
  67. printf("%2d ", i);
  68. if (dest[i] == 0xffffffff) {
  69. printf(" ");
  70. } else {
  71. printf("%2d ", dest[i]);
  72. }
  73. for (size_t j=0;j<block_size;++j) {
  74. printf("%02x", buf[i*block_size+j]);
  75. }
  76. printf("\n");
  77. }
  78. }
  79. delete[] buf;
  80. delete[] dest;
  81. }
  82. #endif