Hi everyone,
I was playing around with the intel-intrinsics library, trying to improve the speed of a simple area function. I could not see any performance improvements from the non-SIMD implementation. The SIMD version is a little bit slower even with LDC2 and --o3. Can anyone help me to understand what I am missing?
///
double areaMeters(const double[2][] coordinates) @safe pure {
if (coordinates.length <= 2) {
return 0;
}
///
double rad(const double a) pure @safe @nogc {
return a * PI / 180;
}
double result = 0;
enum radius = 6_378_137;
foreach(i; 0 .. coordinates.length - 1) {
auto p1 = coordinates[i];
auto p2 = coordinates[i + 1];
result += rad(p2[0] - p1[0]) * (2 + sin(rad(p1[1])) + sin(rad(p2[1])));
}
return result * radius * radius / 2;
}
double areaMetersSimd(const double[2][] coordinates) @safe pure {
if (coordinates.length <= 2) {
return 0;
}
__m128d pi_2 = cast(__m128d)[PI, PI];
__m128d pattern180_2 = cast(__m128d)[180., 180.];
double result = 0;
enum radius = 6_378_137;
foreach(i; 0 .. coordinates.length - 1) {
auto p1 = _mm_div_pd(_mm_mul_pd(cast(__m128d) coordinates[i], pi_2), pattern180_2);
auto p2 = _mm_div_pd(_mm_mul_pd(cast(__m128d) coordinates[i + 1], pi_2), pattern180_2);
auto diff = _mm_sub_sd(p1, p2);
result += diff[0] * (2 + sin(p1[1]) + sin(p2[1]));
}
return result * radius * radius / 2;
}
CPU info:
cat /proc/cpuinfo
processor : 0
vendor_id : AuthenticAMD
cpu family : 23
model : 113
model name : AMD Ryzen 7 3800X 8-Core Processor
stepping : 0
microcode : 0x8701030
cpu MHz : 3741.289
cache size : 512 KB
physical id : 0
siblings : 16
core id : 0
cpu cores : 8
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 16
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf rapl pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate ssbd mba ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr rdpru wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif v_spec_ctrl umip rdpid overflow_recov succor smca sev sev_es
bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass retbleed smt_rsb srso
bogomips : 7784.95
TLB size : 3072 4K pages
clflush size : 64
cache_alignment : 64
address sizes : 43 bits physical, 48 bits virtual
power management: ts ttp tm hwpstate cpb eff_freq_ro [13] [14]
Thanks!
Bogdan