2017-01-05 8 views
0

Мы реализовали несколько алгоритмов с использованием языка галидов, который использует arctan, как тригонометрические функции. Но для измерительных целей мы хотим заставить Halide не генерировать векторные инструкции.Есть ли способ заставить Halide не генерировать код, который использует векторные инструкции?

Мы используем визуальный C++ в окнах и cl компилятор в цепочке инструментов Visual Studio 2013. Пока пытается заставить cl использовать /arch:IA32, но он все еще генерирует векторные инструкции.

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

ответ

1

Вы должны быть в состоянии установить target, например, host-x86-64, который должен помешать Halide использовать любую векторию (например, используя инструкции sse4/avx *).

Если вы используете AOT с генераторами, посмотрите на: http://halide-lang.org/tutorials/tutorial_lesson_15_generators_usage.html My_first_generator_basic не должен использовать SIMD-инструкции.

Не слишком знакомы с JIT, но этот пример показывает, как установить цель, в то время как JITing: https://github.com/halide/Halide/wiki/Minimal-GPU-example Вы должны использовать аналогичный подход, чтобы указать цель как x86-64.

3

Как правило, Halide не генерирует никакого кода для atan, и реализация будет поступать из системной математической библиотеки (libm). (Это неверно для всех математических процедур, поскольку мы предоставляем внутренние реализации для некоторых, но обычно это делается явным путем таких имен, как fast_log, fast_exp и т. Д.). Чтобы переопределить это, вы обычно предоставляете свою собственную реализацию libm или atan (и atan2 и т. д.), но Halide может позволить вам определить atan_f32 и atan_f64 для переопределения. Это может быть выгодно, поскольку те должны быть объявлены со слабой связью, хотя это, вероятно, не работает в Windows. Вы также можете изменить определения этих подпрограмм в src/runtime/posix_math.ll, чтобы указать на свои собственные.

В целом, Halide генерирует только векторизованный код, если в расписании говорится об этом. Однако llvm имеет автоматические пропуски векторизации, которые могут генерировать векторные инструкции. В x86_64 инструкции SIMD обычно используются для вычисления скалярных вычислений с плавающей запятой. В 32-разрядном x86, если вы не включаете ни один из x86 SIMD-флагов в Target (например, ни один из SSE41, AVX и т. Д.), Мы должны установить целевую машину llvm для полного запрета инструкций SIMD. Но это не повлияет на материал в libm, если вы не предпримете меры для этого в конечное время ссылки.

Вы также можете использовать HalideExtern, чтобы объявить вызов обычной процедуре и использовать ее вместо atan.

+0

Я посмотрел на этот пример .. https://github.com/halide/Halide/blob/master/test/correctness/c_function.cpp Но, похоже, скомпилированный код cl.exe не может найти символы –