1
0

CpuGenerators.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. #include "CpuGenerators.h"
  2. #include "Fixed.h"
  3. #include <omp.h>
  4. #include <memory>
  5. using mnd::CpuGeneratorFloat;
  6. using mnd::CpuGeneratorDouble;
  7. using mnd::CpuGenerator128;
  8. void CpuGeneratorFloat::generate(const mnd::MandelInfo& info, float* data)
  9. {
  10. const MandelViewport& view = info.view;
  11. omp_set_num_threads(2 * omp_get_num_procs());
  12. #pragma omp parallel for
  13. for (long j = 0; j < info.bHeight; j++) {
  14. float y = float(view.y) + float(j) * float(view.height / info.bHeight);
  15. long i = 0;
  16. for (i; i < info.bWidth; i++) {
  17. float x = float(view.x + double(i) * view.width / info.bWidth);
  18. float a = x;
  19. float b = y;
  20. int k = 0;
  21. for (k = 0; k < info.maxIter; k++) {
  22. float aa = a * a;
  23. float bb = b * b;
  24. float ab = a * b;
  25. a = aa - bb + x;
  26. b = ab + ab + y;
  27. if (aa + bb > 16) {
  28. break;
  29. }
  30. }
  31. data[i + j * info.bWidth] = k;
  32. }
  33. }
  34. }
  35. void CpuGeneratorDouble::generate(const mnd::MandelInfo& info, float* data)
  36. {
  37. const MandelViewport& view = info.view;
  38. omp_set_num_threads(2 * omp_get_num_procs());
  39. #pragma omp parallel for
  40. for (long j = 0; j < info.bHeight; j++) {
  41. double y = double(view.y) + double(j) * double(view.height / info.bHeight);
  42. long i = 0;
  43. for (i; i < info.bWidth; i++) {
  44. double x = view.x + double(i) * view.width / info.bWidth;
  45. double a = x;
  46. double b = y;
  47. int k = 0;
  48. for (k = 0; k < info.maxIter; k++) {
  49. double aa = a * a;
  50. double bb = b * b;
  51. double ab = a * b;
  52. a = aa - bb + x;
  53. b = ab + ab + y;
  54. if (aa + bb > 16) {
  55. break;
  56. }
  57. }
  58. data[i + j * info.bWidth] = k;
  59. }
  60. }
  61. }
  62. void CpuGenerator128::generate(const mnd::MandelInfo& info, float* data)
  63. {
  64. const MandelViewport& view = info.view;
  65. omp_set_num_threads(2 * omp_get_num_procs());
  66. #pragma omp parallel for
  67. for (long j = 0; j < info.bHeight; j++) {
  68. Fixed128 y = Fixed128(view.y) + Fixed128(j) * Fixed128(view.height / info.bHeight);
  69. long i = 0;
  70. for (i; i < info.bWidth; i++) {
  71. Fixed128 x = view.x + Fixed128(i) * Fixed128(view.width / info.bWidth);
  72. Fixed128 a = x;
  73. Fixed128 b = y;
  74. int k = 0;
  75. for (k = 0; k < info.maxIter; k++) {
  76. Fixed128 aa = a * a;
  77. Fixed128 bb = b * b;
  78. Fixed128 ab = a * b;
  79. a = aa - bb + x;
  80. b = ab + ab + y;
  81. if (aa + bb > Fixed128(16)) {
  82. break;
  83. }
  84. }
  85. data[i + j * info.bWidth] = k;
  86. }
  87. }
  88. }