2017-02-08 4 views
0

Я экспериментировал с несколькими целевыми функциями, которые были созданы раньше времени - статическая библиотека. Я написал генератор и смог генерировать статические библиотеки и файлы заголовков для нескольких целевых функций, таких как 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

Это порядок целей, которые я попробовал.

  1. не работает

    • SSE41, AVX, AVX2
    • SSE41, AVX2, AVX
    • AVX2, SSE41, AVX
    • AVX, SSE41, AVX2
  2. Работы

    • AVX2, AVX, SSE41
    • AVX, AVX2, SSE41
+1

В соответствии с комментарием 'compile_to_multitarget_static_library',' 'каждая результирующая функция будет считаться (в порядке)'. Поэтому вы должны заказать их с самого высокого до самого низкого, то есть avx2, avx, sse41. –

+1

Хури правильно относится к заказу, но это не должно приводить к сбою при сбое или правильности, а только к субоптимальной производительности. (В приведенном выше примере цели avx и avx2 никогда не будут выбраны, потому что все такие машины также имеют sse41, и первая цель sse41 будет выбрана первой.) –

+0

@KhouriGiordano Ваше предложение предотвратило крах! –

ответ

1

Мульти-целевой функция предназначена, чтобы сделать то, что вы пытаетесь сделать. Существует функция-оболочка, которая вызывает halide_can_use_target_features и вызывает вызовы подпрограммы, скомпилированной с этими функциями, если она возвращает true.

Является ли сбой инструкцией по AVX или AVX2? Он работает, если в дополнение к SSE 4.1 добавлен только AVX или только AVX2?

Вы можете переопределить halide_can_use_target_features, вызвав halide_set_custom_can_use_target_features. Это должно позволить вам отслеживать вызовы и изолировать, если ошибка находится в логике этой процедуры.

0

То, что вы делаете, должно (теоретически) работать нормально и не сбрасываться (хотя, как указано выше, указанный вами порядок приведет к субоптимальной производительности).

Первый интересный вопрос - посмотреть, какова природа аварии - незаконная инструкция? что-то другое? Захват этой информации будет очень полезен.

+0

Крушение захватывается незаконным обработчиком сигнала. –

Смежные вопросы