3 ms·
Yes, thats needed when you have counters in global memory. In that case, instead of just having vector<double> you would put each double into a stricture aligne
by ashvardanian 5y ago
Yes, thats needed when you have counters in global memory. In that case, instead of just having vector<double> you would put each double into a stricture aligned to 64 byte addresses. Here all the counters are on local stack, so that trick unfortunately wont help
- hinkley 5y agoFor the single threaded version, I believe they have a similar problem with auto sums = _mm256_set1_ps(0); for (; it + 8 < end; it += 8) sums = _mm256_add_ps(_mm256_loadu_ps(it), sums); Where each SMD op is trying to overwrite to a compact data structure. But in the threaded version https://github.com/unum-cloud/ParallelReductions/blob/fd16d9f64d18a53fa662b636359a89b579bdd2b3/reduce_cpu.hpp#L256 https://github.com/unum-cloud/ParallelReductions/blob/fd16d9... they have separate slots for an accumulator but it's still in a shared vector, which most likely has the issue I described.