0

arctan三角関数のようなものを使用する Halide 言語を使用していくつかのアルゴリズムを実装しました。しかし、インストルメンテーションの目的で、Halide にベクトル命令を生成させないようにしたいと考えています。

Windows では Visual C++ を使用しcl、Visual Studio 2013 ツール チェーンではコンパイラを使用しています。clこれまでのところ、使用を強制しようとして/arch:IA32いますが、それでもベクトル命令が生成されます。

Halide 言語側から何らかの形でこれを強制する方法や、数学ライブラリの呼び出しをインターセプトする方法はありますか?そこで、Halide に、arctanベクトル命令を使用するように最適化されていない私たちが作成した関数を使用するように依頼できます。

4

2 に答える 2

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 フラグのいずれもオンにしない場合 (たとえば、SSE41、AVX などのいずれもオンにしない場合)、llvm ターゲット マシンを設定して SIMD 命令を完全に禁止する必要があります。ただし、最終リンク時に対策を講じない限り、libm 内のものには影響しません。

また、HalideExtern を使用して、独自に選択したルーチンへの呼び出しを宣言し、atan の代わりにそれを使用することもできます。

于 2017-01-05T19:15:30.593 に答える
1

を、たとえば host-x86-64に設定できるはずですtarget。これにより、Halide がベクトル化 (つまり、sse4/avx* 命令を使用) を使用するのを防ぐことができます。

ジェネレーターで AOT を使用している場合は、http ://halide-lang.org/tutorials/tutorial_lesson_15_generators_usage.html を参照してください。

JIT にはあまり詳しくありませんが、次の例は JIT 中にターゲットを設定する方法を示しています: https://github.com/halide/Halide/wiki/Minimal-GPU-example同様のアプローチを使用してターゲットを指定できるはずです。 x86-64 として。

于 2017-01-05T18:55:04.590 に答える