Я экспериментировал с несколькими целевыми функциями, которые были созданы раньше времени - статическая библиотека. Я написал генератор и смог генерировать статические библиотеки и файлы заголовков для нескольких целевых функций, таких как target=x86-64-windows-sse41,x86-64-windows-avx,x86-64-windows-avx2
Однако после подключения к моему приложению приложение аварийно завершает работу. Когда я укажу только target=x86-64-windows-sse41
, приложение работает нормально. Да, моя система поддерживает SSE4.1.Многоцелевая статическая библиотека - авария
Я понимаю, что при компиляции для нескольких целей Halide проверит поддержку функций во время выполнения и вызовет соответствующую спецификацию.
Я сделал dumpbin /All mylib.lib /out:mylib.txt
и нашел символы для sse41, avx и avx2. У него также есть External | halide_can_use_target_features
Похоже, что я пропустил какой-то шаг. Любые указатели на то, как использовать эту функциональность?
Благодаря
Update
Вот что мой процессор поддерживает - Выписка из Coreinfo утилита
Intel(R) Xeon(R) CPU E5-2697 v2 @ 2.70GHz Intel64 Family 6 Model 37 Stepping 1, GenuineIntel Microcode signature: 00000428 FPU * Implements i387 floating point instructions MMX * Supports MMX instruction set MMXEXT - Implements AMD MMX extensions 3DNOW - Supports 3DNow! instructions 3DNOWEXT - Supports 3DNow! extension instructions SSE * Supports Streaming SIMD Extensions SSE2 * Supports Streaming SIMD Extensions 2 SSE3 * Supports Streaming SIMD Extensions 3 SSSE3 * Supports Supplemental SIMD Extensions 3 SSE4a - Supports Streaming SIMDR Extensions 4a SSE4.1 * Supports Streaming SIMD Extensions 4.1 SSE4.2 * Supports Streaming SIMD Extensions 4.2 AES * Supports AES extensions AVX - Supports AVX intruction extensions FMA - Supports FMA extensions using YMM state MSR * Implements RDMSR/WRMSR instructions MTRR * Supports Memory Type Range Registers XSAVE - Supports XSAVE/XRSTOR instructions OSXSAVE - Supports XSETBV/XGETBV instructions RDRAND - Supports RDRAND instruction RDSEED - Supports RDSEED instruction
Это порядок целей, которые я попробовал.
не работает
- SSE41, AVX, AVX2
- SSE41, AVX2, AVX
- AVX2, SSE41, AVX
- AVX, SSE41, AVX2
Работы
- AVX2, AVX, SSE41
- AVX, AVX2, SSE41
В соответствии с комментарием 'compile_to_multitarget_static_library',' 'каждая результирующая функция будет считаться (в порядке)'. Поэтому вы должны заказать их с самого высокого до самого низкого, то есть avx2, avx, sse41. –
Хури правильно относится к заказу, но это не должно приводить к сбою при сбое или правильности, а только к субоптимальной производительности. (В приведенном выше примере цели avx и avx2 никогда не будут выбраны, потому что все такие машины также имеют sse41, и первая цель sse41 будет выбрана первой.) –
@KhouriGiordano Ваше предложение предотвратило крах! –