すべてのスレッドは同じ入力パラメータを受け取ります。この場合、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を使用することは可能ですが、パフォーマンスの料金を支払うことに注意してください。
出典
2011-10-27 09:02:01
Tom
「 '' '' 'は何を意味していますか?各配列の長さは? –
ブロックごとにテキストのすべての要素にアクセスしますか?あなたのカーネル設定はどうですか? – pQB