aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--aberth/aberth.cpp12
-rw-r--r--aberth/aberth_kernel.fut25
2 files changed, 22 insertions, 15 deletions
diff --git a/aberth/aberth.cpp b/aberth/aberth.cpp
index 6936809..550760d 100644
--- a/aberth/aberth.cpp
+++ b/aberth/aberth.cpp
@@ -342,11 +342,12 @@ static vector<uint8_t> drawImage(int W, int H, const vector<int> &counts, int ma
static vector<int32_t> invoke_kernel(
int32_t width, int32_t height,
- double left, double top, double right, double bottom,
+ Com bottomLeft, Com topRight,
int32_t seed) {
futhark_context_config *config = futhark_context_config_new();
// futhark_context_config_select_device_interactively(config);
+ futhark_context_config_set_debugging(config, 1);
futhark_context *ctx = futhark_context_new(config);
@@ -364,7 +365,8 @@ static vector<int32_t> invoke_kernel(
check_ret(futhark_entry_main_all(
ctx, &dest_arr,
width, height,
- left, top, right, bottom,
+ bottomLeft.real(), topRight.imag(),
+ topRight.real(), bottomLeft.imag(),
seed));
check_ret(futhark_context_sync(ctx));
@@ -391,9 +393,9 @@ int main(int argc, char **argv) {
if (argc <= 1) {
// tie(W, H, counts) = computeCounts();
W = H = 2000;
- Com bottomLeft = Com(-1.6, -1.6);
- Com topRight = Com(1.6, 1.6);
- counts = invoke_kernel(W, H, bottomLeft.real(), topRight.imag(), topRight.real(), bottomLeft.imag(), 42);
+ Com bottomLeft = Com(0, -1.6);
+ Com topRight = Com(1.6, 0);
+ counts = invoke_kernel(W, H, bottomLeft, topRight, 42);
writeCounts(W, H, counts, "out.txt");
} else if (argc == 2) {
tie(W, H, counts) = readCounts(argv[1]);
diff --git a/aberth/aberth_kernel.fut b/aberth/aberth_kernel.fut
index fae1450..58b8838 100644
--- a/aberth/aberth_kernel.fut
+++ b/aberth/aberth_kernel.fut
@@ -128,11 +128,13 @@ let calc_index (value: f64) (left: f64) (right: f64) (steps: i32): i32 =
let point_index
(width: i32) (height: i32)
- (top_left: complex) (bottom_right: complex)
+ (bottom_left: complex) (top_right: complex)
(pt: complex)
: i32 =
- let xi = calc_index (c64.re pt) (c64.re top_left) (c64.re bottom_right) width
- let yi = calc_index (c64.im pt) (c64.im bottom_right) (c64.im top_left) height
+ -- Range for 'yi' is reversed because image coordinates go down in the y
+ -- direction, while complex coordinates go up in the y direction
+ let xi = calc_index (c64.re pt) (c64.re bottom_left) (c64.re top_right) width
+ let yi = calc_index (c64.im pt) (c64.im top_right) (c64.im bottom_left) height
in if 0 <= xi && xi < width && 0 <= yi && yi < height
then width * yi + xi
else -1
@@ -145,16 +147,19 @@ entry main_job
: []i32 =
-- Unnecessary to give each polynomial a different seed
let rng = rand_engine.rng_from_seed [seed]
- let top_left = c64.mk left top
- let bottom_right = c64.mk right bottom
- let indices = filter (\i -> i != -1) (flatten
+ let bottom_left = c64.mk left bottom
+ let top_right = c64.mk right top
+ let indices = flatten
(map (\idx ->
let p = derbyshire_at_index idx
let (_, pts) = aberth.aberth p rng
- let indices = map (point_index width height top_left bottom_right) pts
- in indices)
- (start_index ..< start_index + num_polys)))
- in reduce_by_index (replicate (width * height) 0) (+) 0 indices (replicate (length indices) 1)
+ in map (point_index width height bottom_left top_right) pts)
+ (start_index ..< start_index + num_polys))
+ let filtered = filter (\i -> i != -1) indices
+ in reduce_by_index (replicate (width * height) 0)
+ (+) 0
+ filtered
+ (replicate (length filtered) 1)
entry main_all
(width: i32) (height: i32)