2012-03-30 4 views

答えて

26

残念ながら、__device__修飾子で指定されていない関数をデバイスで呼び出すことはできません。

:あなたはCUDA乱数発生器 のデバイスコードルックで乱数に必要がある場合は、あなたがそれに両方__host____device__修飾子カーネルの使用から呼び出したい独自のホスト機能を持っている場合は http://developer.nvidia.com/curand

をcurand

__host__ __device__ int add(int a, int b) 
{ 
    return a + b; 
} 

このファイルをNVCCコンパイラドライバでコンパイルすると、機能の2つのバージョンがコンパイルされます.1つはホストコードで呼び出し可能で、もう1つはデバイスコードで呼び出すことができます。これが、この機能をホストコードとデバイスコードの両方で呼び出すことができる理由です。

+1

cudaビルトイン機能を使用するのではなく、ホスト機能を呼び出す際のパフォーマンスのダウングレードはどのくらいですか? – Mattia

+0

これは、ホストとデバイスがそれぞれ独自の機能のコピーのみを実行することを意味しますか? – avgvstvs

5

計算の互換性をコンパイルするときに利用できる「ランド()」が、「printfの」のようないくつかのホスト機能には適用されませんですが> = 2.0

例:

nvcc.exe -gencode=arch=compute_10,code=\sm_10,compute_10\... 
error : calling a host function("printf") from a __device__/__global__ function("myKernel") is not allowed 

コンパイルとsm_20で動作します、compute_20

7

ここでは、その問題を解決する方法はありません。

CPU上で通常実行されるものはすべて、それが可能であることを何ら保証することなく、CUDA環境に合わせて調整する必要があります。ホスト関数は、通常のC関数のCUDAの別名です。つまり、すべてのC/C++のようなCPUメモリのフォンノイマンアーキテクチャ上で動作する関数は、これまでのところPC上で実行されていました。 GPUは莫大な量の計算能力を提供しますが、コストはそれほど柔軟でないか互換性がないということです。最も重要なのは、メインメモリにアクセスする機能を持たずに実行され、アクセスできるメモリが限られていることです。

乱数ジェネレータの場合、NvidiaがSMPあたり最大256個のスレッドをサポートできる高性能なメルセンヌツイスターを具体的に実装することに苦労していることを考えると、あなたは幸運です。これは、私のhereの以前の記事で説明したデバイス関数の中で呼び出すことができます。誰かがこの機能を説明するより良いリンクを見つけた場合は、私のものを削除し、リンクと共に適切なテキストをここに置き換えてください。

私が絶えず驚いているのは、標準化された高品質の擬似乱数ジェネレータがどのようになっているかをプログラマが気づかないように見えることです。 「自分でローリングする」というのは、擬似乱数がどのくらいあるかを考えると、実際には良い考えではありません。許容可能な予測不可能な数字を提供するものとして発電機を確認することは、私は次のような意味で、他の回答の一部に反対する必要が

-1

...仕事や学問的才能がかかる:問題を記述していない

OP あなたがデバイスコードから関数__host__を呼び出すことができないことは残念ではありません。それは他の方法では全く不可能であり、それは悪いことではありません。

説明:ホスト(CPU)コードは、CDプレーヤーに入れたCDのように思えます。あなたが小型音楽プレーヤーに入れたSDカードのようなデバイスコード上で。OPの質問は、 "私はどのように私の小型音楽プレーヤーにディスクを押し込むことができます"ですか?あなたはすることはできませんし、それは欲しいとは理にかなっていません。ホストコードとデバイスコードは全く同じ計算タスクを実行しませんが、基本的に同じ機能を持つコード(同じ機能を持つコード)でも可能ですが、メディアは交換できません。

関連する問題