1. ホーム
  2. cuda

[解決済み] ファンネルシフトとは?

2022-02-16 06:43:26

質問

CUDA 5.0 プログラミングガイドを読んでいて、3.5 の計算可能なデバイスにはあるが 3.0 にはない "Funnel shift" と呼ばれる機能に行き当たりました。この機能には、「リファレンスマニュアルを参照してください」という注釈がありますが、マニュアルで「ファネルシフト」という用語を検索しても、何も出てきません。

ググってみたが、以下のサイトにしか記載がなかった。 http://www.cudahandbook.com 第8章に掲載されています。

8.2.3 ファネルシフト (SM 3.5)

GK110 では、64 ビットの「ファンネルシフト」命令を追加し、以下の組込み関数でアクセスできるようにし ました。

__funnelshift_lc():左ファネルシフトの最上位32ビットを返します。

__funnelshift_rc(): 右ファネルシフトの最下位 32 ビットを返します。

これらの組込み部品は、インラインデバイスとして実装されています。 関数 (インライン PTX アセンブラを使用) は sm_35_intrinsics.h にあります。

しかし、quot;left funnel shift" や "right funnel shift" が何であるかについては、まだ説明されていないのです。

では、それは何なのか、どこに必要なのか。

どのように解決するのか?

CUDAの場合、2つの32ビットレジスタを連結して64ビット値にし、その値を左または右にシフトし、最上位(左シフトの場合)または最下位(右シフトの場合)32ビットを返します。

からの組込み関数 sm_35_intrinsics.h は以下の通りです。

unsigned int __funnelshift_lc(unsigned int lo, unsigned int hi, unsigned int shift);
unsigned int __funnelshift_rc(unsigned int lo, unsigned int hi, unsigned int shift);

Andy Glew (dead link removed)によると、ファンネルシフトの応用として、高速な不整列memcpyや、上のコメントでnjuffaが言及しているように、2つの入力ワードが同じであれば、rotateの実装に使用することができるそうです。