openframeworks / apothecary

This is the OpenFrameworks library apothecary. It mixes formulas and potions to build and update the C/C++ lib dependencies.
Other
56 stars 51 forks source link

SIMD (instrincts) CPU Optimization - Audit Dependencies, build cache, output lib headers, deploy and core #322

Closed danoli3 closed 10 months ago

danoli3 commented 10 months ago

Searching whole openFrameworks directory (latest) including all build cache for apothecary for code linking to instincts

RE: https://github.com/openframeworks/openFrameworks/issues/7789

In order for MSVC ARM/ARM64/ARM64EC code must be patched and or verified not causing linking and build issues for these targets.

Code using SIMD headers must be adapted accordingly. Patches can be applied upsteam to dependencies

apothecary/scripts/simd.sh "openFrameworksVS" Searching for xmmintrin.h in openFrameworksVS

grep: apothecary/build/FreeImage/build_vs_64/Debug/FreeImage.pdb: Device or resource busy
apothecary/build/FreeImage/Source/LibOpenJPEG/dwt.c:35:#include <xmmintrin.h>
apothecary/build/FreeImage/Source/LibOpenJPEG/mct.c:35:#include <xmmintrin.h>
apothecary/build/opencv/3rdparty/include/opencl/1.2/CL/cl.hpp:217:#include <xmmintrin.h>
apothecary/build/opencv/3rdparty/include/opencl/1.2/CL/cl_platform.h:355:        #include <xmmintrin.h>
apothecary/build/opencv/3rdparty/openjpeg/openjp2/dwt.c:47:#include <xmmintrin.h>
apothecary/build/opencv/3rdparty/openjpeg/openjp2/mct.c:41:#include <xmmintrin.h>
apothecary/build/opencv/3rdparty/openjpeg/openjp2/t1.c:45:#include <xmmintrin.h>
apothecary/build/opencv/cmake/checks/cpu_sse.cpp:1:#include <xmmintrin.h>
apothecary/build/opencv/modules/core/include/opencv2/core/utils/fp_control.private.hpp:17:  #include <xmmintrin.h>
apothecary/build/pixman/configure:13529:#include <xmmintrin.h>
apothecary/build/pixman/configure:13592:#include <xmmintrin.h>
apothecary/build/pixman/configure.ac:430:#include <xmmintrin.h>
apothecary/build/pixman/configure.ac:474:#include <xmmintrin.h>
apothecary/build/pixman/meson.build:165:        #include <xmmintrin.h>
apothecary/build/pixman/meson.build:200:        #include <xmmintrin.h>
apothecary/build/pixman/pixman/pixman-sse2.c:36:#include <xmmintrin.h> /* for _mm_shuffle_pi16 and _MM_SHUFFLE */
apothecary/build/pixman/pixman/pixman-ssse3.c:32:#include <xmmintrin.h>
apothecary/build/pixman/test/utils-prng.c:31:#include <xmmintrin.h>

Searching for emmintrin.h in openFrameworksVS

openFrameworksVS/addons/ofxOpenCv/libs/opencv/include/opencv2/core/fast_math.hpp:73:    #include <emmintrin.h>
openFrameworksVS/libs/opencv/include/opencv2/core/fast_math.hpp:73:    #include <emmintrin.h>
apothecary/build/assimp/contrib/rapidjson/include/rapidjson/reader.h:36:#include <emmintrin.h>
apothecary/build/assimp/contrib/rapidjson/include/rapidjson/writer.h:35:#include <emmintrin.h>
apothecary/build/assimp/contrib/stb/stb_image.h:724:#include <emmintrin.h>
apothecary/build/FreeImage/build_vs_64/include/LibWebP/src/dsp/common_sse2.h:23:#include <emmintrin.h>
apothecary/build/FreeImage/build_vs_64/include/OpenEXR/IlmImf/ImfSimd.h:54:    #include <emmintrin.h>
apothecary/build/FreeImage/build_vs_arm64/include/LibWebP/src/dsp/common_sse2.h:23:#include <emmintrin.h>
apothecary/build/FreeImage/build_vs_arm64/include/OpenEXR/IlmImf/ImfSimd.h:54:    #include <emmintrin.h>
apothecary/build/FreeImage/Source/LibJXR/image/decode/strdec_x86.c:32:#include <emmintrin.h>
apothecary/build/FreeImage/Source/LibJXR/image/encode/strenc_x86.c:31:#include <emmintrin.h>
apothecary/build/FreeImage/Source/LibWebP/src/dsp/alpha_processing_sse2.c:17:#include <emmintrin.h>
apothecary/build/FreeImage/Source/LibWebP/src/dsp/common_sse2.h:23:#include <emmintrin.h>
apothecary/build/FreeImage/Source/LibWebP/src/dsp/cost_sse2.c:17:#include <emmintrin.h>
apothecary/build/FreeImage/Source/LibWebP/src/dsp/dec_sse2.c:25:#include <emmintrin.h>
apothecary/build/FreeImage/Source/LibWebP/src/dsp/enc_sse2.c:19:#include <emmintrin.h>
apothecary/build/FreeImage/Source/LibWebP/src/dsp/filters_sse2.c:19:#include <emmintrin.h>
apothecary/build/FreeImage/Source/LibWebP/src/dsp/lossless_enc_sse2.c:18:#include <emmintrin.h>
apothecary/build/FreeImage/Source/LibWebP/src/dsp/lossless_sse2.c:21:#include <emmintrin.h>
apothecary/build/FreeImage/Source/LibWebP/src/dsp/rescaler_sse2.c:17:#include <emmintrin.h>
apothecary/build/FreeImage/Source/LibWebP/src/dsp/ssim_sse2.c:19:#include <emmintrin.h>
apothecary/build/FreeImage/Source/LibWebP/src/dsp/upsampling_sse2.c:19:#include <emmintrin.h>
apothecary/build/FreeImage/Source/LibWebP/src/dsp/yuv_sse2.c:20:#include <emmintrin.h>
apothecary/build/FreeImage/Source/OpenEXR/IlmImf/ImfSimd.h:54:    #include <emmintrin.h>

apothecary/build/opencv/3rdparty/include/opencl/1.2/CL/cl.hpp:216:#include <emmintrin.h>
apothecary/build/opencv/3rdparty/include/opencl/1.2/CL/cl_platform.h:369:        #include <emmintrin.h>
apothecary/build/opencv/3rdparty/libwebp/sharpyuv/sharpyuv_sse2.c:18:#include <emmintrin.h>
apothecary/build/opencv/3rdparty/libwebp/src/dsp/alpha_processing_sse2.c:17:#include <emmintrin.h>
apothecary/build/opencv/3rdparty/libwebp/src/dsp/common_sse2.h:23:#include <emmintrin.h>
apothecary/build/opencv/3rdparty/libwebp/src/dsp/cost_sse2.c:17:#include <emmintrin.h>
apothecary/build/opencv/3rdparty/libwebp/src/dsp/dec_sse2.c:25:#include <emmintrin.h>
apothecary/build/opencv/3rdparty/libwebp/src/dsp/enc_sse2.c:19:#include <emmintrin.h>
apothecary/build/opencv/3rdparty/libwebp/src/dsp/filters_sse2.c:19:#include <emmintrin.h>
apothecary/build/opencv/3rdparty/libwebp/src/dsp/lossless_enc_sse2.c:18:#include <emmintrin.h>
apothecary/build/opencv/3rdparty/libwebp/src/dsp/lossless_sse2.c:21:#include <emmintrin.h>
apothecary/build/opencv/3rdparty/libwebp/src/dsp/rescaler_sse2.c:17:#include <emmintrin.h>
apothecary/build/opencv/3rdparty/libwebp/src/dsp/ssim_sse2.c:19:#include <emmintrin.h>
apothecary/build/opencv/3rdparty/libwebp/src/dsp/upsampling_sse2.c:19:#include <emmintrin.h>
apothecary/build/opencv/3rdparty/libwebp/src/dsp/yuv_sse2.c:19:#include <emmintrin.h>
apothecary/build/opencv/3rdparty/openexr/IlmImf/ImfSimd.h:59:    #include <emmintrin.h>
apothecary/build/opencv/3rdparty/openjpeg/openjp2/dwt.c:50:#include <emmintrin.h>
apothecary/build/opencv/3rdparty/openjpeg/openjp2/mct.c:44:#include <emmintrin.h>
apothecary/build/opencv/3rdparty/openjpeg/openjp2/t1.c:48:#include <emmintrin.h>
apothecary/build/opencv/build_vs_arm64/Debug/include/opencv2/core/fast_math.hpp:73:    #include <emmintrin.h>
apothecary/build/opencv/build_vs_arm64/Release/include/opencv2/core/fast_math.hpp:73:    #include <emmintrin.h>
apothecary/build/opencv/cmake/checks/cpu_sse2.cpp:1:#include <emmintrin.h>
apothecary/build/opencv/modules/core/include/opencv2/core/fast_math.hpp:73:    #include <emmintrin.h>
apothecary/build/pixman/configure:13530:#include <emmintrin.h>
apothecary/build/pixman/configure:13593:#include <emmintrin.h>
apothecary/build/pixman/configure.ac:431:#include <emmintrin.h>
apothecary/build/pixman/configure.ac:475:#include <emmintrin.h>
apothecary/build/pixman/meson.build:166:        #include <emmintrin.h>
apothecary/build/pixman/meson.build:201:        #include <emmintrin.h>
apothecary/build/pixman/pixman/pixman-sse2.c:37:#include <emmintrin.h> /* for SSE2 intrinsics */
apothecary/build/pixman/pixman/pixman-ssse3.c:33:#include <emmintrin.h>
out/opencv/include/opencv2/core/fast_math.hpp:73:    #include <emmintrin.h>

Searching for immintrin.h in openFrameworksVS

openFrameworksVS/libs/glm/include/glm/detail/func_common_simd.inl:8:#include <immintrin.h>
apothecary/build/FreeImage/Source/LibWebP/src/dsp/cpu.c:85:#include <immintrin.h>
apothecary/build/glm/glm/detail/func_common_simd.inl:8:#include <immintrin.h>
apothecary/build/libpng/intel/filter_sse2_intrinsics.c:20:#include <immintrin.h>
apothecary/build/opencv/3rdparty/include/opencl/1.2/CL/cl_platform.h:441:        #include <immintrin.h>
apothecary/build/opencv/3rdparty/libpng/intel/filter_sse2_intrinsics.c:20:#include <immintrin.h>
apothecary/build/opencv/3rdparty/libspng/spng.c:6210:#include <immintrin.h>
apothecary/build/opencv/3rdparty/libwebp/src/dsp/cpu.c:85:#include <immintrin.h>
apothecary/build/opencv/3rdparty/openjpeg/openjp2/dwt.c:56:#include <immintrin.h>
apothecary/build/opencv/cmake/checks/cpu_avx.cpp:4:#include <immintrin.h>
apothecary/build/opencv/cmake/checks/cpu_avx2.cpp:4:#include <immintrin.h>
apothecary/build/opencv/cmake/checks/cpu_avx512.cpp:2:#include <immintrin.h>
apothecary/build/opencv/cmake/checks/cpu_avx512clx.cpp:2:#include <immintrin.h>
apothecary/build/opencv/cmake/checks/cpu_avx512cnl.cpp:2:#include <immintrin.h>
apothecary/build/opencv/cmake/checks/cpu_avx512common.cpp:2:#include <immintrin.h>
apothecary/build/opencv/cmake/checks/cpu_avx512icl.cpp:2:#include <immintrin.h>
apothecary/build/opencv/cmake/checks/cpu_avx512knl.cpp:2:#include <immintrin.h>
apothecary/build/opencv/cmake/checks/cpu_avx512knm.cpp:2:#include <immintrin.h>
apothecary/build/opencv/cmake/checks/cpu_avx512skx.cpp:2:#include <immintrin.h>
apothecary/build/opencv/cmake/checks/cpu_fp16.cpp:4:#include <immintrin.h>
apothecary/build/opencv/modules/gapi/src/backends/fluid/gfluidimgproc_simd_avx2.hpp:11:#include <immintrin.h>
out/glm/include/glm/detail/func_common_simd.inl:8:#include <immintrin.h>

Searching for arm_neon.h in openFrameworksVS

openFrameworksVS/libs/glm/include/glm/simd/neon.h:7:#include <arm_neon.h>
apothecary/build/assimp/contrib/rapidjson/include/rapidjson/reader.h:38:#include <arm_neon.h>
apothecary/build/assimp/contrib/rapidjson/include/rapidjson/writer.h:37:#include <arm_neon.h>
apothecary/build/assimp/contrib/stb/stb_image.h:781:#include <arm_neon.h>
apothecary/build/FreeImage/build_vs_64/include/LibWebP/src/dsp/neon.h:15:#include <arm_neon.h>
apothecary/build/FreeImage/build_vs_64/include/LibWebP/src/dsp/quant.h:20:#include <arm_neon.h>
apothecary/build/FreeImage/build_vs_arm64/include/LibWebP/src/dsp/neon.h:15:#include <arm_neon.h>
apothecary/build/FreeImage/build_vs_arm64/include/LibWebP/src/dsp/quant.h:20:#include <arm_neon.h>
apothecary/build/FreeImage/Source/LibWebP/src/dsp/lossless_enc_neon.c:18:#include <arm_neon.h>
apothecary/build/FreeImage/Source/LibWebP/src/dsp/lossless_neon.c:18:#include <arm_neon.h>
apothecary/build/FreeImage/Source/LibWebP/src/dsp/neon.h:15:#include <arm_neon.h>
apothecary/build/FreeImage/Source/LibWebP/src/dsp/quant.h:20:#include <arm_neon.h>
apothecary/build/FreeImage/Source/LibWebP/src/dsp/rescaler_neon.c:18:#include <arm_neon.h>
apothecary/build/FreeImage/Source/LibWebP/src/dsp/upsampling_neon.c:20:#include <arm_neon.h>
apothecary/build/glm/glm/simd/neon.h:7:#include <arm_neon.h>
apothecary/build/opencv/3rdparty/carotene/src/common.hpp:52:#include <arm_neon.h>
apothecary/build/opencv/3rdparty/carotene/src/intrinsics.hpp:45:#include <arm_neon.h>
apothecary/build/opencv/3rdparty/libjpeg-turbo/src/simd/arm/aarch32/jchuff-neon.c:38:#include <arm_neon.h>
apothecary/build/opencv/3rdparty/libjpeg-turbo/src/simd/arm/aarch64/jchuff-neon.c:40:#include <arm_neon.h>
apothecary/build/opencv/3rdparty/libjpeg-turbo/src/simd/arm/jccolor-neon.c:34:#include <arm_neon.h>
apothecary/build/opencv/3rdparty/libjpeg-turbo/src/simd/arm/jcgray-neon.c:32:#include <arm_neon.h>
apothecary/build/opencv/3rdparty/libjpeg-turbo/src/simd/arm/jcphuff-neon.c:33:#include <arm_neon.h>
apothecary/build/opencv/3rdparty/libjpeg-turbo/src/simd/arm/jcsample-neon.c:32:#include <arm_neon.h>
apothecary/build/opencv/3rdparty/libjpeg-turbo/src/simd/arm/jdcolor-neon.c:33:#include <arm_neon.h>
apothecary/build/opencv/3rdparty/libjpeg-turbo/src/simd/arm/jdmerge-neon.c:33:#include <arm_neon.h>
apothecary/build/opencv/3rdparty/libjpeg-turbo/src/simd/arm/jdsample-neon.c:32:#include <arm_neon.h>
apothecary/build/opencv/3rdparty/libjpeg-turbo/src/simd/arm/jfdctfst-neon.c:32:#include <arm_neon.h>
apothecary/build/opencv/3rdparty/libjpeg-turbo/src/simd/arm/jfdctint-neon.c:34:#include <arm_neon.h>
apothecary/build/opencv/3rdparty/libjpeg-turbo/src/simd/arm/jidctfst-neon.c:32:#include <arm_neon.h>
apothecary/build/opencv/3rdparty/libjpeg-turbo/src/simd/arm/jidctint-neon.c:35:#include <arm_neon.h>
apothecary/build/opencv/3rdparty/libjpeg-turbo/src/simd/arm/jidctred-neon.c:34:#include <arm_neon.h>
apothecary/build/opencv/3rdparty/libjpeg-turbo/src/simd/arm/jquanti-neon.c:31:#include <arm_neon.h>
apothecary/build/opencv/3rdparty/libjpeg-turbo/src/simd/CMakeLists.txt:252:    #include <arm_neon.h>
apothecary/build/opencv/3rdparty/libjpeg-turbo/src/simd/CMakeLists.txt:264:  #include <arm_neon.h>
apothecary/build/opencv/3rdparty/libjpeg-turbo/src/simd/CMakeLists.txt:276:  #include <arm_neon.h>
apothecary/build/opencv/3rdparty/libjpeg-turbo/src/simd/CMakeLists.txt:287:  #include <arm_neon.h>
apothecary/build/opencv/3rdparty/libspng/spng.c:6607:    #include <arm_neon.h>
apothecary/build/opencv/3rdparty/libwebp/sharpyuv/sharpyuv_neon.c:19:#include <arm_neon.h>
apothecary/build/opencv/3rdparty/libwebp/src/dsp/lossless_enc_neon.c:18:#include <arm_neon.h>
apothecary/build/opencv/3rdparty/libwebp/src/dsp/lossless_neon.c:18:#include <arm_neon.h>
apothecary/build/opencv/3rdparty/libwebp/src/dsp/neon.h:19:#include <arm_neon.h>
apothecary/build/opencv/3rdparty/libwebp/src/dsp/quant.h:20:#include <arm_neon.h>
apothecary/build/opencv/3rdparty/libwebp/src/dsp/rescaler_neon.c:18:#include <arm_neon.h>
apothecary/build/opencv/3rdparty/libwebp/src/dsp/upsampling_neon.c:20:#include <arm_neon.h>
apothecary/build/opencv/cmake/checks/cpu_dotprod.cpp:4:#include "arm_neon.h"
apothecary/build/opencv/cmake/checks/cpu_fp16.cpp:15:#include "arm_neon.h"
out/glm/include/glm/simd/neon.h:7:#include <arm_neon.h>

Searching for arm64_neon.h in openFrameworksVS

openFrameworksVS/libs/openFrameworks/utils/ofConstants.h:394:  #include <arm64_neon.h> // intrinsics SIMD on https://learn.microsoft.com/en-us/cpp/intrinsics/arm64-intrinsics?view=msvc-170
apothecary/build/opencv/3rdparty/libspng/spng.c:6605:    #include <arm64_neon.h>
Finished
danoli3 commented 10 months ago

Again a lot of these headers are not included or built for targets just here is full instincts audit for more details following this issue.

danoli3 commented 10 months ago
#if defined __SSE2__ || (_MSC_VER >= 1300 && !_M_CEE_PURE) && !defined(__arm__) && !defined(__aarch64__) && !defined(_M_ARM) && !defined(_M_ARM64) && !defined(_M_ARM64EC)
danoli3 commented 10 months ago

Validated all these are good:

apothecary/build/FreeImage/Source/LibOpenJPEG/dwt.c:35:#include <xmmintrin.h>
apothecary/build/FreeImage/Source/LibOpenJPEG/mct.c:35:#include <xmmintrin.h>
apothecary/build/opencv/3rdparty/include/opencl/1.2/CL/cl.hpp:217:#include <xmmintrin.h>
apothecary/build/opencv/3rdparty/include/opencl/1.2/CL/cl_platform.h:355:        #include <xmmintrin.h>
apothecary/build/opencv/3rdparty/openjpeg/openjp2/dwt.c:47:#include <xmmintrin.h>
apothecary/build/opencv/3rdparty/openjpeg/openjp2/mct.c:41:#include <xmmintrin.h>
apothecary/build/opencv/3rdparty/openjpeg/openjp2/t1.c:45:#include <xmmintrin.h>
apothecary/build/opencv/cmake/checks/cpu_sse.cpp:1:#include <xmmintrin.h>
apothecary/build/opencv/modules/core/include/opencv2/core/utils/fp_control.private.hpp:17:  #include <xmmintrin.h>
apothecary/build/pixman/configure:13529:#include <xmmintrin.h>
apothecary/build/pixman/configure:13592:#include <xmmintrin.h>
apothecary/build/pixman/configure.ac:430:#include <xmmintrin.h>
apothecary/build/pixman/configure.ac:474:#include <xmmintrin.h>
apothecary/build/pixman/meson.build:165:        #include <xmmintrin.h>
apothecary/build/pixman/meson.build:200:        #include <xmmintrin.h>
apothecary/build/pixman/pixman/pixman-sse2.c:36:#include <xmmintrin.h> /* for _mm_shuffle_pi16 and _MM_SHUFFLE */
apothecary/build/pixman/pixman/pixman-ssse3.c:32:#include <xmmintrin.h>
apothecary/build/pixman/test/utils-prng.c:31:#include <xmmintrin.h>
danoli3 commented 10 months ago

Confirmed all fixed!