controller_main.cc 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. #include <NTL/ZZ.h>
  2. #include <iostream>
  3. #include <string.h>
  4. #include <stdlib.h>
  5. #include <unistd.h>
  6. #include "controller.h"
  7. NTL_CLIENT
  8. // The total number of nodes (that is, dpnodes)
  9. static unsigned short total_nodes = 1;
  10. // The amount of memory we can use per dpnode
  11. static unsigned short GB_mem_per_node = 1;
  12. void desired_resources(const ZZ &order, unsigned short &desired_dpnodes,
  13. unsigned int &max_workers, unsigned int &dpfreq)
  14. {
  15. // One point in how many is a DP by default?
  16. unsigned int dpscale = 1000;
  17. ZZ sorder = SqrRoot(order);
  18. // How many DPnodes should we use for a problem of this size?
  19. // 338 is bytes per DP in the table. 10 is a safety factor.
  20. ZZ dpnumerator = sorder * 338 * 10;
  21. ZZ dpdenominator;
  22. dpdenominator = GB_mem_per_node;
  23. dpdenominator *= 1000000000UL; // Convert the above line to GB
  24. ZZ dpnodes = (dpnumerator / (dpdenominator * dpscale)) + 1;
  25. if (dpnodes > total_nodes) {
  26. desired_dpnodes = total_nodes;
  27. ZZ zzdpscale = dpnumerator / (dpdenominator * total_nodes);
  28. if (NumBits(zzdpscale) > 31) {
  29. dpscale = 4294967295U;
  30. } else {
  31. dpscale = trunc_long(zzdpscale, 31);
  32. }
  33. } else {
  34. desired_dpnodes = trunc_long(dpnodes, 31);
  35. }
  36. // How many workers would we like to use?
  37. ZZ sorder23 = sorder >> 23;
  38. if (NumBits(sorder23) > 30) {
  39. // Just use all the workers we can find
  40. max_workers = 4294967295U; // 2^32 - 1
  41. } else {
  42. max_workers = trunc_long(sorder23,31) + 1;
  43. }
  44. // By default, 1 in dpscale points are distinguished points.
  45. dpfreq = 4294967295U / dpscale;
  46. // Orders smaller than 100*scale^2 behave specially, in order to
  47. // avoid DP-free cycles
  48. ZZ orderlimit;
  49. orderlimit = 100;
  50. orderlimit *= dpscale;
  51. orderlimit *= dpscale;
  52. if (order < 1000) {
  53. // Just make every point a DP
  54. dpfreq = 4294967295U;
  55. } else if (order < orderlimit) {
  56. // The frequency of DPs should be 10/sqrt(order) to avoid
  57. // a DP-free cycle, so dpfreq = (10*2^32)/sqrt(order)
  58. ZZ f = (to_ZZ(10) << 32) / SqrRoot(order);
  59. dpfreq = trunc_long(f, 31);
  60. }
  61. }
  62. static void boundcb(const char *boundaddr, unsigned short boundport)
  63. {
  64. cout << "Listening on " << boundaddr << ":" << boundport << "\n";
  65. const char *fdenv = getenv("CONTROLLER_BOUNDCB_FD");
  66. if (fdenv) {
  67. int fd = atoi(fdenv);
  68. if (fd > 2) {
  69. write(fd, &boundport, 2);
  70. write(fd, boundaddr, strlen(boundaddr));
  71. close(fd);
  72. }
  73. }
  74. }
  75. #ifdef TEST_DESIRED_RESOURCES
  76. int main(int argc, char **argv)
  77. {
  78. if (argc != 3) {
  79. std::cerr << "Usage: " << argv[0] << " num_nodes GB_mem_per_node\n";
  80. return 1;
  81. }
  82. total_nodes = strtoul(argv[1], NULL, 10);
  83. GB_mem_per_node = strtoul(argv[2], NULL, 10);
  84. cout << "# log_2(order) dpnodes workers dpfreq\n";
  85. for (int i=44; i<=92; ++i) {
  86. unsigned short desired_dpnodes;
  87. unsigned int max_workers;
  88. unsigned int dpfreq;
  89. ZZ order;
  90. order = 1;
  91. order <<= i;
  92. order += 1;
  93. desired_resources(order, desired_dpnodes, max_workers, dpfreq);
  94. cout << i << " " << desired_dpnodes << " " << max_workers << " "
  95. << dpfreq << "\n";
  96. }
  97. }
  98. #else
  99. int main(int argc, char **argv)
  100. {
  101. unsigned short bindport = 0;
  102. Worklist worklist;
  103. if (controller_parse_args(argc, argv, bindport, worklist,
  104. total_nodes, GB_mem_per_node)) {
  105. std::cerr << "Usage: " << argv[0] << " [-p listenport] [-n num_nodes] [-m GB_mem_per_node] [-r reps] N1 iter1 N2 iter2 ...\n";
  106. return 1;
  107. }
  108. return controller_main(worklist, bindport, boundcb);
  109. }
  110. #endif