マクスウェルアーキテクチャNVIDIA blogに応じLOP3呼ばPTXアセンブリ内の新しい命令を導入しました:MaxwellとNVIDIAアーキテクチャのためのLOP3ベースの命令を書くには?
「とは、複数の入力に対して複雑な論理演算 を実行するときの手順を保存することができます。」 GTC 2016
で
、いくつかのCUDA開発者は、このような命令でTegraはX1のプロセッサ用atan2f関数(マックスウェル)を促進することができました。
ただし、.cu
ファイル内に定義されている以下の関数は、__SET_LT
と__LOP3_0xe2
の未定義の定義につながります。
代わりに.ptx
ファイルに定義する必要がありますか?もしそうなら、どうですか?
float atan2f(const float dy, const float dx)
{
float flag, z = 0.0f;
__SET_LT(flag, fabsf(dy), fabsf(dx));
uint32_t m, t1 = 0x80000000;
float t2 = float(M_PI)/2.0f;
__LOP3_0x2e(m, __float_as_int(dx), t1, __float_as_int(t2));
float w = flag * __int_as_float(m) + float(M_PI)/2.0f;
float Offset = copysignf(w, dy);
float t = fminf(fabsf(dx), fabsf(dy))/fmaxf(fabsf(dx), fabsf(dy));
uint32_t r, b = __float_as_int(flag) << 2;
uint32_t mask = __float_as_int(dx)^__float_as_int(dy)^(~b);
__LOP3_0xe2(r, mask, t1, __floast_as_int(t));
const float p = fabsf(__int_as_float(r)) - 1.0f;
return ((-0.0663f*(-p) + 0.311f) * (-p) + float(float(M_PI)/4.0)) * (*(float *)&r) + Offset;
}
編集:
マクロ定義は、最終的に次のとおり
#define __SET_LT(D, A, B) asm("set.lt.f32.f32 %0, %1, %2;" : "=f"(D) : "f"(A), "f"(B))
#define __SET_GT(D, A, B) asm("set.gt.f32.f32 %0, %1, %2;" : "=f"(D) : "f"(A), "f"(B))
#define __LOP3_0x2e(D, A, B, C) asm("lop3.b32 %0, %1, %2, %3, 0x2e;" : "=r"(D) : "r"(A), "r"(B), "r"(C))
#define __LOP3_0xe2(D, A, B, C) asm("lop3.b32 %0, %1, %2, %3, 0xe2;" : "=r"(D) : "r"(A), "r"(B), "r"(C))
「__SET_LT」と「__LOP3_0xe2」がどこにあるのかよくわかりません。あなたがオンラインソースからそれらをつかんだ場合、私はあなたがあなたの質問でそれを特定したとは思わない。とにかく、CUDA C/C++ソースコードから特定のPTX命令を呼び出す最も直接的な方法は、[inline PTX]を使用することです(http://docs.nvidia.com/cuda/inline-ptx-assembly/index.html#using -inline-ptx-assembly-in-cuda)を実行します。 –
http://on-demand.gputechconf.com/gtc/2016/presentation/s6108-max-lv-pedestrian-detection-tegra-x1.pdf – Madhatter
最後のスライドを確認 – Madhatter