PTX は、最終的には個々のマイクロアーキテクチャの SASS アセンブリ言語に C/C++ GPU コードをコンパイルするための中間表現です。したがって、特定の nVIDIA GPU マイクロアーキテクチャの実際の命令セットにある特定の穴/ガフ/まぐれ/特異性によって妨げられることは想定されていません。
現在、PTX には、レジスタ内の先行ゼロの数をカウントするための命令がありますclz
。それでもctz
、後続ゼロの数をカウントする対応する命令がありません。これらの操作は「対称的」であり、特にその抽象的で特定のハードウェアで利用可能なものにバインドされていない場合、命令セットで両方が表示されるか、まったく表示されないことが確実に予想されます。一般的な CPU アーキテクチャには、長年にわたって両方がありました。
奇妙なことに、CUDAヘッダーdevice_functions.h
は関数を宣言します
* \brief Find the position of the least significant bit set to 1 in a 32 bit integer.
*
* [etc.]
*
* \return Returns a value between 0 and 32 inclusive representing the position of the first bit set.
* - __ffs(0) returns 0.
*/
__DEVICE_FUNCTIONS_DECL__ __device_builtin__ int __ffs(int x);
この機能:
- count-trailing-zeros とほぼ同じセマンティクスを持ちます - すべてゼロの入力のみが異なります。
- 単一の PTX 命令に変換されるのではなく、ビットごとの否定と
clz
. - 対応する可能性のあるものもありませ
__fls
ん - 最後のセットを見つけてください。
それで、それはなぜですか?明らかな命令が PTX になく、ヘッダーに存在する命令とほぼ同じ「偽のビルトイン」が存在するのはなぜですか?