2011-07-04 16 views
2

これは、この投稿の選択された回答へのフォローアップの質問です:Output of cuda program is not what was expectedCuda char *変数の割り当て

は、以下の機能が動作しますが:

__global__ void setVal(char **word) 
{ 

    char *myWord = word[(blockIdx.y * gridDim.x) + blockIdx.x]; 
    myWord[0] = 'H'; 
    myWord[1] = 'e'; 
    myWord[2] = 'l'; 
    myWord[3] = 'l'; 
    myWord[4] = 'o'; 
} 

しないのはなぜこの作品? 2番目のバージョン、myWord = "Hello\0";

__global__ void setVal(char **word) 
{ 

    char *myWord = word[(blockIdx.y * gridDim.x) + blockIdx.x]; 
    myWord = "Hello\0"; 

} 

答えて

4

。あなたの第二のカーネルコード:

$ nvcc -arch=sm_20 -c nullkernel.cu 
nullkernel.cu(3): warning: variable "myWord" was set but never used 

nullkernel.cu(3): warning: variable "myWord" was set but never used 

何を考えることは、文字列のコピー代入が実際にはポインタ代入されているされているので理由を、そして:

__global__ void setVal(char **word) 
{ 
    char *myWord = word[(blockIdx.y * gridDim.x) + blockIdx.x]; 
    myWord = "Hello\0"; 
} 

は、その中に何もヌルカーネルにコンパイルこの場合、コンパイラは、myWordがメモリに書き込まれていないことを知るには十分にスマートなので、すべてのコードを削除し、myWordが使用されていないことを警告します。

私は修辞的な質問をして、コードをこのように再書き込みした場合:

__global__ void setVal(char **word) 
{ 

    char *myWord = word[(blockIdx.y * gridDim.x) + blockIdx.x]; 
    const char[] mymsg = "Hello\0"; 
    myWord = mymsg; 
} 

より明白になり、両方と、それは「暗黙的に」実行することができませんでした理由コードはコンパイルしない理由コンパイルした場合でも文字列のコピーの割り当てですか?

+0

したがって、単語の特定のインデックスを文字列に設定するにはどうすればよいですか。単語[0]を "hello"に設定したいとします。 – Programmer

+0

投稿した最初のカーネルバージョンのように、ソース文字列の値を宛先文字列にコピーします。あなた自身のstrcpyの実装を書いてください。 GPUハードウェアは8ビットタイプよりも32ビットタイプで作業するほうがはるかに優れているので、charではなくchar4ベクトルタイプを使用して内部的に動作させることを検討してください。 – talonmies

4

"Hello\0"**wordパラメータで与えられた空間に格納されていません。文字列は、おそらく実行可能ファイルの.rodataセクションに格納されます。割り当てによって、単にポインタmyWordが更新されます。データの一括コピーは行われません。 (talonmies points outとして、コンパイラはポインタ更新が全く必要でないことを知り、関数全体を最適化することができます)。

一般に、Cは簡単なバルクデータコピーメカニズムを提供しません言語に組み込まれています - デザイナーは高価なものを考えなければなりませんでしたlook高価です。したがって、PL/Iは多次元配列のすべての要素に0を割り当てますが、非常に簡単な操作:A = 0;、Cはネストされたfor()ループをmemset()ループで強制的に実行して高価であるという考え方を強制します。

(関数パラメータにstruct要素をコピーすると、バルク・コピー・ルールの唯一の例外です。)あなたは、コンパイラからの出力にはるかに注意を払って起動する必要があります

+0

cudaにstrcpyはありますか? – Programmer

+1

@Programmer:いいえありません。 – talonmies

関連する問題