2011-10-26 7 views
0

どのようにパラメータベクトルをcudaの各インスタンスでローカル変数として扱うことができますか?Cudaでカーネルごとにパラメータベクトルをローカルに作るには

__global__ void kern(char *text, int N){ 
//if i change text[0]='0'; the change only affects the current instance of the kernel and not the other threads 
} 

ありがとうございます!

+1

「 '' '' 'は何を意味していますか?各配列の長さは? –

+0

ブロックごとにテキストのすべての要素にアクセスしますか?あなたのカーネル設定はどうですか? – pQB

答えて

2

すべてのスレッドは同じ入力パラメータを受け取ります。この場合、char *textはすべてのスレッドで同じです。これはプログラミングモデルの基本的な部分です。ポインタがグローバルメモリを指しているので、一方のスレッドがポインタを介してデータを変更する(すなわちグローバルメモリを変更する)と、その変更は全てのスレッドに影響を及ぼす(危険を無視する)。

これは、ポインタを介してアクセスする複数のスレッドを持つことを除いて、これは標準Cとまったく同じです。言い換えれば、標準のC関数の中でtext [0]を変更すると、その変更は関数の外で見ることができます。

私が正しく理解している場合は、すべてのスレッドにtextという内容のローカルコピーを依頼しています。私はあなたがsm_20以降を持っていると仮定してい

__global__ void kern(char* text, int N) { 
    // If you have an upper bound for N... 
    char localtext[NMAX]; 
    // If you don't know the range of N... 
    char *localtext; 
    localtext = malloc(N*sizeof(char)); 

    // Copy from text to localtext 
    // Since each thread has the same value for i this will 
    // broadcast from the L1 cache 
    for (int i = 0 ; i < N ; i++) 
     localtext[i] = text[i]; 

    //... 
} 

注:機能外に目に見える変化をしたくない場合はまあソリューションは、標準Cの場合とまったく同じです。また、デバイスコードでmallocを使用することは可能ですが、パフォーマンスの料金を支払うことに注意してください。

+0

カーネル内でホスト機能を呼び出すことはできません。あなたのアプローチは共有メモリを使って行わなければなりません – pQB

+2

@pQB:カーネル内のmallocはFermi上でサポートされています。これは答えの中で指摘されていたものです: 'sm_20以降があると仮定しています。' – talonmies

+0

Tom: 。私は読むよりも速いが、私は読む。 @タロモンミー:レビューをありがとう – pQB

関連する問題