On Sun, Nov 03, 2024 at 11:02:16AM -0500, Ben Beasley wrote:
> Kevin’s observation about floating-point rounding and runtime dispatch is an 
> excellent one in general.
> 
> Those two CPU’s should, as far as I can tell, be dispatched to the same SIMD 
> implementations in this case.
> 
> Skimming 
> https://github.com/qt/qtbase/blob/v6.8.0/src/gui/painting/qimagescale_sse4.cpp,
>  it looks like a fixed-point implementation that entirely avoids 
> floating-poont operations. If there are no bugs, and if I’m not missing 
> something, it should be possible to get identical results regardless of ISA 
> extensions since no rounding is involved.
> 
> The fact that the scaling algorithm appears to be integer-based also makes 
> the following sources of irreproducibility less likely, but maybe not 
> impossible:
> 
> - Some algorithms compute “left-over” leading and/or trailing data with a 
> scalar algorithm, and in some cases this could make the results depend on 
> alignment of buffers in memory. Besides the fact that this is an integer 
> implementation, at a glance, Qt doesn’t appear to be doing this. It looks 
> like QImage must be aligned and (over-)allocated to allow everything to be 
> done in SIMD, processing some extra pixels outside the image as necessary to 
> make complete vectors.
>
> - SIMD algorithms might operate on input values and combine pixels in a 
> different order than scalar ones, which could result in different rounding 
> for floating-point operations. That shouldn’t matter for an integer algorithm 
> like this, except maybe in cases of wrapping/overflow – which might perhaps 
> be in play here.
> 
> Another relevant fact is that the implementation is multi-threaded using a 
> thread pool. If there is anything that depends on the order in which 
> pixels/blocks are computed and combined, this could also result in different 
> outputs, even in different runs on the same machine, and especially on 
> machines with different numbers of cores.

Thanks, those are all good considerations. I ran the conversion under
valgrind just to make sure it's not some trivial memory bug, but valgrind
doesn't report anything. This code is exectued from Python, so I think it's
unlikely that there's some alignment problem or memory use bug. If there
was, we'd be seeing it much more. (And if we were reading past the end of
a buffer, I'd expect some actual corruption, i.e. random looking pixel values,
not a subtle difference. So essentially the problem is that we have an
integer algorithm where we don't expect any rounding effects, but we get
an effect that looks like rounding error. ¯\_(ツ)_/¯

Zbyszek
-- 
_______________________________________________
devel mailing list -- devel@lists.fedoraproject.org
To unsubscribe send an email to devel-le...@lists.fedoraproject.org
Fedora Code of Conduct: 
https://docs.fedoraproject.org/en-US/project/code-of-conduct/
List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines
List Archives: 
https://lists.fedoraproject.org/archives/list/devel@lists.fedoraproject.org
Do not reply to spam, report it: 
https://pagure.io/fedora-infrastructure/new_issue

Reply via email to