Skip to content

Commit 1aa287e

Browse files
committed
slight optimization of main perturbation loop ~2-5%
1 parent 4fc4ed9 commit 1aa287e

File tree

3 files changed

+85
-14
lines changed

3 files changed

+85
-14
lines changed

default.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
image_width = 1920
22
image_height = 1080
3-
frames = 9999
4-
export = "raw"
3+
frames = 1
4+
export = "colour"
55
rotate = 0
66
glitch_tolerance = 0.000001
77
zoom_scale = 2.0

locations/infinity.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
real = "-1.7693831791955150182138472860854737829057472636547514374655282165278881912647564588361634463895296673044858257818203031574874912384217194031282461951137475212550848062085787454772803303225167998662391124184542743017129214423639793169296754394181656831301342622793541423768572435783910849972056869527305207508191441734781061794290699753174911133714351734166117456520272756159178932042908932465102671790878414664628213755990650460738372283470777870306458882898202604001744348908388844962887074505853707095832039410323454920540534378406083202543002080240776000604510883136400112955848408048692373051275999457470473671317598770623174665886582323619043055508383245744667325990917947929662025877792679499645660786033978548337553694613673529685268652251959453874971983533677423356377699336623705491817104771909424891461757868378026419765129606526769522898056684520572284028039883286225342392455089357242793475261134567912757009627599451744942893765395578578179137375672787942139328379364197492987307203001409779081030965660422490200242892023288520510396495370720268688377880981691988243756770625044756604957687314689241825216171368155083773536285069411856763404065046728379696513318216144607821920824027797857625921782413101273331959639628043420017995090636222818019324038366814798438238540927811909247543259203596399903790614916969910733455656494065224399357601105072841234072044886928478250600986666987837467585182504661923879353345164721140166670708133939341595205900643816399988710049682525423837465035288755437535332464750001934325685009025423642056347757530380946799290663403877442547063918905505118152350633031870270153292586262005851702999524577716844595335385805548908126325397736860678083754587744508953038826602270140731059161305854135393230132058326419325267890909463907657787245924319849651660028931472549400310808097453589135197164989941931054546261747594558823583006437970585216728326439804654662779987947232731036794099604937358361568561860539962449610052967074013449293876425609214167615079422980743121960127425155223407999875999884"
22
imag = "0.00423684791873677221492650717136799707668267091740375727945943565011234400080554515730243099502363650631353268335965257182300494805538736306127524814939292355930892834392050796724887904921986666045576626946900666103494014904714323725586979789908520656683202658064024115300378826789786394641622035341055102900456305723718684527210377325846307917512628774672005693326232806953822796755832517188873479124361430989485495501124096329421682827330693532171505367455526637382706988583456915684673202462211937384523487065290004627037270912806345336469007546411109669407622004367957958476890043040953462048335322273359167297049252960438077167010004209439515213189081508634843224000870136889065895088138204552309352430462782158649681507477960551795646930149740918234645225076516652086716320503880420325704104486903747569874284714830068830518642293591138468762031036739665945023607640585036218668993884533558262144356760232561099772965480869237201581493393664645179292489229735815054564819560512372223360478737722905493126886183195223860999679112529868068569066269441982065315045621648665342365985555395338571505660132833205426100878993922388367450899066133115360740011553934369094891871075717765803345451791394082587084902236263067329239601457074910340800624575627557843183429032397590197231701822237810014080715216554518295907984283453243435079846068568753674073705720148851912173075170531293303461334037951893251390031841730968751744420455098473808572196768667200405919237414872570568499964117282073597147065847005207507464373602310697663458722994227826891841411512573589860255142210602837087031792012000966856067648730369466249241454455795058209627003734747970517231654418272974375968391462696901395430614200747446035851467531667672250261488790789606038203516466311672579186528473826173569678887596534006782882871835938615860588356076208162301201143845805878804278970005959539875585918686455482194364808816650829446335905975254727342258614604501418057192598810476108766922935775177687770187001388743012888530139038318783958771247007926690"
3-
zoom = "1.0E1400"
4-
iterations = 3000000
3+
zoom = "1.0E2005"
4+
iterations = 15000000

src/math/perturbation.rs

Lines changed: 81 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,38 +6,46 @@ use crate::math::reference::Reference;
66
pub struct Perturbation {}
77

88
impl Perturbation {
9-
pub fn iterate(pixel_data: &mut Vec<PixelData>, reference: &Reference) {
10-
pixel_data.par_chunks_mut(8)
9+
pub fn iterate(pixel_data: &mut [PixelData], reference: &Reference) {
10+
pixel_data.par_chunks_mut(4)
1111
.for_each(|pixel_data| {
12-
for pixel in pixel_data.iter_mut() {
12+
for pixel in pixel_data {
1313
let mut scaled_iterations = 0;
1414
let mut scaled_scale_factor_1 = 1.0f64.ldexp(pixel.delta_current.exponent);
1515
let mut scaled_delta_reference = 1.0f64.ldexp(pixel.delta_reference.exponent - pixel.delta_current.exponent) * pixel.delta_reference.mantissa;
1616

17-
while pixel.iteration < reference.current_iteration {
17+
let val1 = pixel.iteration - reference.start_iteration;
18+
let val2 = reference.current_iteration - reference.start_iteration;
19+
let reference_slice = &reference.reference_data[val1..=val2];
20+
21+
for additional_iterations in 0..=(reference.current_iteration - pixel.iteration) {
22+
let reference_data = &reference_slice[additional_iterations];
23+
1824
// 2 multiplications and 2 adds
19-
let z = reference.reference_data[pixel.iteration - reference.start_iteration].z_fixed + scaled_scale_factor_1 * pixel.delta_current.mantissa;
25+
let z = reference_data.z_fixed + scaled_scale_factor_1 * pixel.delta_current.mantissa;
2026

2127
if pixel.delta_current.exponent > -500 {
2228
// 2 multiplications and one add
2329
let z_norm = z.norm_sqr();
2430

25-
if z_norm < reference.reference_data[pixel.iteration - reference.start_iteration].z_tolerance {
31+
if z_norm < reference_data.z_tolerance {
32+
pixel.iteration += additional_iterations;
2633
pixel.glitched = true;
2734
break;
2835
}
2936

3037
if z_norm > 1e16 {
38+
pixel.iteration += additional_iterations;
3139
pixel.escaped = true;
3240
pixel.delta_current.mantissa = pixel.delta_current.to_float();
3341
pixel.delta_current.exponent = 0;
3442
break;
3543
}
3644
}
3745

38-
if reference.reference_data[pixel.iteration - reference.start_iteration].extended_precision_required {
46+
if reference_data.extended_precision_required {
3947
// If the reference is small, use the slow extended method
40-
pixel.delta_current *= reference.reference_data[pixel.iteration - reference.start_iteration].z_extended * 2.0 + pixel.delta_current;
48+
pixel.delta_current *= reference_data.z_extended * 2.0 + pixel.delta_current;
4149
pixel.delta_current += pixel.delta_reference;
4250

4351
// reset the scaled counter
@@ -53,7 +61,7 @@ impl Perturbation {
5361
// pixel.delta_current.mantissa = 2.0 * reference.data[pixel.iteration - reference.start_iteration].z_fixed * pixel.delta_current.mantissa + temp * pixel.delta_current.mantissa + scaled_delta_reference;
5462

5563
// 4 multiplications and 2 additions
56-
pixel.delta_current.mantissa *= z + reference.reference_data[pixel.iteration - reference.start_iteration].z_fixed;
64+
pixel.delta_current.mantissa *= z + reference_data.z_fixed;
5765
// 2 additions
5866
pixel.delta_current.mantissa += scaled_delta_reference;
5967

@@ -69,9 +77,72 @@ impl Perturbation {
6977
scaled_iterations = 0;
7078
}
7179
}
80+
}
7281

73-
pixel.iteration += 1;
82+
if !pixel.escaped && !pixel.glitched {
83+
pixel.iteration = reference.current_iteration;
7484
}
85+
86+
// while pixel.iteration < reference.current_iteration {
87+
// let reference_data = &reference.reference_data[pixel.iteration - reference.start_iteration];
88+
89+
// // 2 multiplications and 2 adds
90+
// let z = reference_data.z_fixed + scaled_scale_factor_1 * pixel.delta_current.mantissa;
91+
92+
// if pixel.delta_current.exponent > -500 {
93+
// // 2 multiplications and one add
94+
// let z_norm = z.norm_sqr();
95+
96+
// if z_norm < reference_data.z_tolerance {
97+
// pixel.glitched = true;
98+
// break;
99+
// }
100+
101+
// if z_norm > 1e16 {
102+
// pixel.escaped = true;
103+
// pixel.delta_current.mantissa = pixel.delta_current.to_float();
104+
// pixel.delta_current.exponent = 0;
105+
// break;
106+
// }
107+
// }
108+
109+
// if reference_data.extended_precision_required {
110+
// // If the reference is small, use the slow extended method
111+
// pixel.delta_current *= reference_data.z_extended * 2.0 + pixel.delta_current;
112+
// pixel.delta_current += pixel.delta_reference;
113+
114+
// // reset the scaled counter
115+
// pixel.delta_current.reduce();
116+
117+
// scaled_scale_factor_1 = 1.0f64.ldexp(pixel.delta_current.exponent);
118+
// scaled_delta_reference = 1.0f64.ldexp(pixel.delta_reference.exponent - pixel.delta_current.exponent) * pixel.delta_reference.mantissa;
119+
120+
// scaled_iterations = 0;
121+
// } else {
122+
// // If the reference is not small, use the usual method
123+
124+
// // pixel.delta_current.mantissa = 2.0 * reference.data[pixel.iteration - reference.start_iteration].z_fixed * pixel.delta_current.mantissa + temp * pixel.delta_current.mantissa + scaled_delta_reference;
125+
126+
// // 4 multiplications and 2 additions
127+
// pixel.delta_current.mantissa *= z + reference_data.z_fixed;
128+
// // 2 additions
129+
// pixel.delta_current.mantissa += scaled_delta_reference;
130+
131+
// scaled_iterations += 1;
132+
133+
// // check the counter, if it is > 250, do a normalisation
134+
// if scaled_iterations > 250 {
135+
// pixel.delta_current.reduce();
136+
137+
// scaled_scale_factor_1 = 1.0f64.ldexp(pixel.delta_current.exponent);
138+
// scaled_delta_reference = 1.0f64.ldexp(pixel.delta_reference.exponent - pixel.delta_current.exponent) * pixel.delta_reference.mantissa;
139+
140+
// scaled_iterations = 0;
141+
// }
142+
// }
143+
144+
// pixel.iteration += 1;
145+
// }
75146
}
76147
});
77148
}

0 commit comments

Comments
 (0)