現在、ループとさまざまな CUBLAS 呼び出しを含むホスト関数があります。CC 3.5 デバイスにアクセスできるようになったので、動的並列処理を使用して、より効率的な単一のカーネルを作成できます。ただし、CC < 3.5 デバイスの古い機能を引き続きサポートしたいと考えています。いくつかの gencode を使用して、同じバイナリで複数のデバイスをサポートするようになりました。
-gencode arch=compute_30,code=sm_30 -gencode arch=compute_35,code=sm_35
両方のアーキテクチャをサポートする単一のバイナリを作成し続けたいと思っていますが、ホスト コードでこれを切り替える方法が思い浮かびません。NVCC は、ホストの知る限り、コンパイルされたコード イメージを生成することはできません。
CC < 3.5 用にビルドしているユーザーは 3.5 の機能を使用してカーネルをビルドできないため、これは良くありません (そしてひどく醜いことでもあります)。
cudaGetDevice (¤t_device);
cudaGetDeviceProperties (¤t_device_properties, current_device);
if (current_device_properties.major < 3 && ... etc) {
...
}
else ...
__CUDACC__ または __CUDA_ARCH__ もここでは役に立ちません。
私の推測では、これは不可能であり、別のバイナリのコンパイルを開始し、プリプロセッサでアーキテクチャを切り替える必要があります。しかし、誰かが何かを考えることができれば、素晴らしいです。