<div dir="ltr"><div>Even,<br></div><div>Thanks for your welcoming!</div><div><br></div><div>> <span style="font-family:monospace;font-size:12px;white-space:pre-wrap">Do you know if there have been assessments of the accuracy of those functions, in terms of input range, ULP ? </span></div><div><br></div><div>I know there were measures of accuracy for large input range for almost all the functions, unfortunately I cannot retrieve them. Maybe they are available in this [article](<a href="https://www.researchgate.net/publication/261959890_BoostSIMD_generic_programming_for_portable_SIMDization">https://www.researchgate.net/publication/261959890_BoostSIMD_generic_programming_for_portable_SIMDization</a>). I remember reading them on a website, so probably in the documentation of boost.SIMD. Unfortunately, the repo has been reset and the documentation is not available anymore.</div><div><br></div><div>The drop-in replacement can be found [here](<a href="https://github.com/agenium-scale/nsimd">https://github.com/agenium-scale/nsimd</a>). Although I could not find the data you're looking for, I think you can open an issue to ask them.</div><div></div><div><br></div><div>> <span style="font-family:monospace;font-size:12px;white-space:pre-wrap">For the use case I've in mind for PROJ, a potential point of caution for, let's say a MY_VECTOR_TYPE<double, 4>, would be to make sure it is possible to have > the same code compiled once with SSE2 (in which case this would be 2 SSE registers) and once with AVX (would be a AVX register) within the same library, when > one wants to generate generic binaries with runtime selection of the implementation</span></div><div><br></div><div>Runtime selection of the right implementation is also something we had in mind for a long time. A solution would be to add the target instruction set as an additional parameter of the batch (the xsimd equivalent of the vector you mentioned). This way it becomes possible to instantiate batches of the same size for different instructions sets and have them in a same library. Selection can then be done at build time (with a facade template class that dispatches to the right implementation), or at runtime when loading the library (but I am not sure how to implement this yet).</div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Apr 20, 2020 at 10:41 AM Even Rouault <<a href="mailto:even.rouault@spatialys.com">even.rouault@spatialys.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><u></u>
<div style="font-family:monospace;font-size:9pt;font-weight:400;font-style:normal">
<p style="margin:0px;text-indent:0px">Johan,</p>
<p style="margin:0px;text-indent:0px"> </p>
<p style="margin:0px;text-indent:0px">> Joris Van Den Bossche drew my attention on this thread as I co-authored</p>
<p style="margin:0px;text-indent:0px">> xsimd. I am not here to advertise my own library, but rather to give a bit</p>
<p style="margin:0px;text-indent:0px">> of context about xsimd.</p>
<p style="margin:0px;text-indent:0px"> </p>
<p style="margin:0px;text-indent:0px">Advertizing open source software is always fine :-) Thanks for all this information.</p>
<p style="margin:0px;text-indent:0px"> </p>
<p style="margin:0px;text-indent:0px">> By the way, most of the advanced mathematical functions come from there.</p>
<p style="margin:0px;text-indent:0px"> </p>
<p style="margin:0px;text-indent:0px">Do you know if there have been assessments of the accuracy of those functions, in terms of input range, ULP ? </p>
<p style="margin:0px;text-indent:0px"> </p>
<p style="margin:0px;text-indent:0px">> However,</p>
<p style="margin:0px;text-indent:0px">> we see more an more interest in having the possibility to instantiate</p>
<p style="margin:0px;text-indent:0px">> vectors that map to more than one register withouth requiring to pull</p>
<p style="margin:0px;text-indent:0px">> another complex library with totally unrelated features. So we are</p>
<p style="margin:0px;text-indent:0px">> considering implementing this feature as well in xsimd.</p>
<p style="margin:0px;text-indent:0px"> </p>
<p style="margin:0px;text-indent:0px">I think that could be useful indeed. Perhaps through a dedicated type, so</p>
<p style="margin:0px;text-indent:0px">that the user really knows what they do (and potentially have to check impact on register use by looking at assembly)</p>
<p style="margin:0px;text-indent:0px"> </p>
<p style="margin:0px;text-indent:0px">For the use case I've in mind for PROJ, a potential point of caution for, let's say a MY_VECTOR_TYPE<double, 4>, would be to make sure it is possible to have the same code compiled once with SSE2 (in which case this would be 2 SSE registers) and once with AVX (would be a AVX register) within the same library, when one wants to generate generic binaries with runtime selection of the implementation. If the type has exactly the same name in the -msse and -mavx enabled objects, that could result in One-Definition-Rule violation, and, beyond that theoretical concern, in real symbol clashes if some big functions aren't inlined. I can imagine that could be solved by allowing some way to override / add something to the namespace of the header that would define such type. Or maybe something smarter :-)</p>
<p style="margin:0px;text-indent:0px"> </p>
<p style="margin:0px;text-indent:0px">Even</p>
<p style="margin:0px;text-indent:0px"> </p>
<p style="margin:0px;text-indent:0px">-- </p>
<p style="margin:0px;text-indent:0px">Spatialys - Geospatial professional services</p>
<p style="margin:0px;text-indent:0px"><a href="http://www.spatialys.com" target="_blank">http://www.spatialys.com</a></p></div></blockquote></div>