Krita Source Code Documentation
Loading...
Searching...
No Matches
KoMultiArchBuildSupport.h File Reference
#include "kritamultiarch_export.h"
#include <utility>
#include <xsimd_extensions/xsimd.hpp>
#include <QDebug>

Go to the source code of this file.

Functions

template<class FactoryType , class... Args>
auto createOptimizedClass (Args &&...param)
 
template<class FactoryType , class... Args>
auto createScalarClass (Args &&...params)
 
KRITAMULTIARCH_EXPORT std::tuple< bool, bool > vectorizationConfiguration ()
 

Function Documentation

◆ createOptimizedClass()

template<class FactoryType , class... Args>
auto createOptimizedClass ( Args &&... param)

Definition at line 22 of file KoMultiArchBuildSupport.h.

23{
24 bool useVectorization = true;
25 bool disableAVXOptimizations = false;
26
27 std::tie(useVectorization, disableAVXOptimizations) =
29
30 if (!useVectorization) {
31 qWarning() << "WARNING: vector instructions disabled by the "
32 "\'amdDisableVectorWorkaround\' option!";
33 return FactoryType::template create<xsimd::generic>(
34 std::forward<Args>(param)...);
35 }
36
37 if (disableAVXOptimizations
38 && (xsimd::available_architectures().fma3_avx2
39 || xsimd::available_architectures().avx)) {
40 qWarning() << "WARNING: AVX and AVX2 optimizations are disabled by the "
41 "\'disableAVXOptimizations\' option!";
42 }
43
44#ifdef Q_PROCESSOR_X86
45
46 if (!disableAVXOptimizations &&
47 xsimd::available_architectures().fma3_avx2) {
48
49 return FactoryType::template create<xsimd::fma3<xsimd::avx2>>(
50 std::forward<Args>(param)...);
51
52 } else if (!disableAVXOptimizations &&
53 xsimd::available_architectures().avx) {
54
55 return FactoryType::template create<xsimd::avx>(
56 std::forward<Args>(param)...);
57
58 } else if (xsimd::available_architectures().sse4_1) {
59 return FactoryType::template create<xsimd::sse4_1>(
60 std::forward<Args>(param)...);
61 } else if (xsimd::available_architectures().ssse3) {
62 return FactoryType::template create<xsimd::ssse3>(
63 std::forward<Args>(param)...);
64 } else if (xsimd::available_architectures().sse2) {
65 return FactoryType::template create<xsimd::sse2>(
66 std::forward<Args>(param)...);
67 }
68#elif XSIMD_WITH_NEON64
69 if (xsimd::available_architectures().neon64) {
70 return FactoryType::template create<xsimd::neon64>(
71 std::forward<Args>(param)...);
72 }
73#elif XSIMD_WITH_NEON
74 if (xsimd::available_architectures().neon) {
75 return FactoryType::template create<xsimd::neon>(
76 std::forward<Args>(param)...);
77 }
78#endif // XSIMD_WITH_SSE2
79
80 return FactoryType::template create<xsimd::generic>(
81 std::forward<Args>(param)...);
82}
KRITAMULTIARCH_EXPORT std::tuple< bool, bool > vectorizationConfiguration()

References vectorizationConfiguration().

◆ createScalarClass()

template<class FactoryType , class... Args>
auto createScalarClass ( Args &&... params)

Definition at line 85 of file KoMultiArchBuildSupport.h.

86{
87 return FactoryType::template create<xsimd::generic>(
88 std::forward<Args>(params)...);
89}

◆ vectorizationConfiguration()

KRITAMULTIARCH_EXPORT std::tuple< bool, bool > vectorizationConfiguration ( )

Definition at line 14 of file KoMultiArchBuildSupport.cpp.

15{
16 static const std::tuple<bool, bool> vectorization = [&]() {
17 KConfigGroup cfg = KSharedConfig::openConfig()->group("");
18 // use the old key name for compatibility
19 const bool useVectorization =
20 !cfg.readEntry("amdDisableVectorWorkaround", false);
21 const bool disableAVXOptimizations =
22 cfg.readEntry("disableAVXOptimizations", false);
23
24 return std::make_tuple(useVectorization, disableAVXOptimizations);
25 }();
26
27 return vectorization;
28}