fixed64.cl 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. long mul(long a, long b) {
  2. long upper = mul_hi(a, b);
  3. long lower = a * b;
  4. return (upper << 32) + ((lower >> 32) & 0xFFFFFFFF);
  5. }
  6. __kernel void iterate(__global float* A, const int width,
  7. ulong x, ulong y, ulong pw, ulong ph, int max, int smooth) {
  8. int index = get_global_id(0);
  9. long px = (index % width) ;
  10. long py = (index / width) ;
  11. long xl = x;
  12. long yt = y;
  13. long pixelScaleX = pw;
  14. long pixelScaleY = ph;
  15. long a = xl + pixelScaleX * px; // pixelScaleX * px + xl
  16. long b = yt + pixelScaleY * py; // pixelScaleY * py + yt
  17. long ca = a;
  18. long cb = b;
  19. int n = 0;
  20. while (n < max - 1) {
  21. long aa = mul(a, a);
  22. long bb = mul(b, b);
  23. long ab = mul(a, b);
  24. if (aa + bb > (16LL << 32)) break;
  25. a = aa - bb + ca;
  26. b = ab + ab + cb;
  27. n++;
  28. }
  29. // N + 1 - log (log |Z(N)|) / log 2
  30. if (n >= max - 1)
  31. A[index] = max;
  32. else {
  33. if (smooth != 0) {
  34. float aapprox = ((float) a) * (1.0f / (1LL << 32)); // 3.5527137e-15f;
  35. float bapprox = ((float) b) * (1.0f / (1LL << 32)); // 3.5527137e-15f;
  36. A[index] = ((float) n) + 1 - log(log(aapprox * aapprox + bapprox * bapprox) / 2) / log(2.0f);
  37. }
  38. else
  39. A[index] = ((float)n);
  40. }
  41. }