1

だから、ここに質問があります。大きな1D配列(ラティスを表す)があるCUDAで計算を行い、それを長さ#partのサブ配列に分割し、各スレッドに各サブ配列で2、3の計算を実行させたいと思います。

より具体的には、いくつかのスレッド#threadsといくつかのブロック#blocksがあるとしましょう。配列のサイズはN=2 * #part * #threads*#blocksです。サブアレイに1から2*#blocks *#threadsまでの番号を付ける場合、最初に#threads *#blocksスレッドを使用して偶数のサブアレイで計算を実行し、次に同じ数のスレッドを使用して計算を実行します。奇数のサブ配列。

サブ配列がどこから始まるかを示すローカルインデックスを各スレッドに含めることができると思いました。

そこで、次のインデックスを使用しました。

localIndex = #part * (2 * threadIdx.x + var) + 2 * #part  * #Nthreads * blockIdx.x;

varは、偶数または奇数のサブ配列でスレッドに計算を実行させるかどうかに応じて、1または0のいずれかになります。

実行しようとしましたが、複数のブロックを使用すると問題が発生するようです。インデックス作成で何か問題がありましたか?

ありがとう。

4

2 に答える 2

1
idx = threads_per_block*blockIdx.x + threadIdx.x;
int my_even_offset, my_odd_offset, my_even_idx, my_odd_idx;

int my_offset = floor(float(idx)/float(num_part)); 
my_even_offset = 2*my_offset*num_part;
my_odd_offset = (2*my_offset+1)*num_part;

my_even_idx = idx + my_even_offset;
my_odd_idx  = idx + my_odd_offset;

//Do stuff with the indices.
于 2012-04-16T22:52:57.480 に答える
1

ブロックとスレッドの実行が順番どおりに行われることが保証されていないため、スレッドが集合的に最初に偶数サブ配列を実行し、次に奇数サブ配列を実行することが重要なのはなぜですか?

カーネル ディメンションの設定に x ディメンションのみを使用してインデックスを作成するとします。

subArrayIndexEven = 2 * (blockIdx.x * blockDim.x + threadIdx.x) * part  
subArrayIndexOdd = subArrayIndexEven + part

証明:

BLOCK_SIZE = 3
NUM_OF_BLOCKS = 2 部分
= 4

N = 2 * 3 * 2 * 4 = 48

T(threadIdx.x, blockIdx.x)
T(0, 1) -> 偶数 = 2 * (1 * 3 + 0) * 4 = 24、奇数 = 28
T(1, 1) -> 偶数 = 2 * ( 1 * 3 + 1) * 4 = 32、奇数 = 36
T(2, 1) -> 偶数 = 2 * (1 * 3 + 2) * 4 = 40、奇数 = 44

于 2012-04-16T22:49:18.683 に答える