0

最長共通サブシーケンスを計算する CUDA コードを作成しようとしています。スレッドのセルを計算するための依存関係が満たされるまで、スレッドをスリープ状態にする方法がわかりません。

すなわち

// Ignore the spurious maths here, very messy data structures. Planning ahead to strings that are bigger then GPU blocks. i & j are correct though.
int real_i = blockDim.x * blockIdx.x + threadIdx.x;
int real_j = blockDim.y * (max_offset - blockIdx.x) + threadIdx.y;

char i_char = seq1[real_i];
char j_char = seq2[real_j];

// For i & j = 1 to length
if((real_i > 0 && real_j > 0) && (real_i < sequence_length && real_j < sequence_length) {

    printf("i: %d, j: %d\n", real_i, real_j);
    printf("I need to wait for dependancy at i: %d j: %d and i: %d j: %d\n", real_i, (real_j - 1), real_i - 1, real_j);
    printf("Is this true? %d\n", (depend[sequence_length * real_i + (real_j - 1)] && depend[sequence_length * (real_i - 1) + real_j]));

    //WAIT FOR DEPENDENCY TO BE SATISFIED
    //THIS IS WHERE I NEED THE CODE TO HANG
    while( (depend[sequence_length * real_i + (real_j - 1)] == false) && (depend[sequence_length * (real_i - 1) + real_j] == false) ) {
    }

    if (i_char == j_char)
        c[sequence_length * real_i + real_j] = (c[sequence_length * (real_i - 1) + (real_j - 1)]) + 1;
     else
        c[sequence_length * real_i + real_j] = max(c[sequence_length * real_i + (real_j - 1)], c[sequence_length * (real_i - 1) + real_j]);

    // SETTING THESE TO TRUE SHOULD ALLOW OTHER THREADS TO BREAK PAST THE WHILE BLOCK
    depend[sequence_length * real_i + (real_j - 1)] = true;
    depend[sequence_length * (real_i - 1) + real_j] = true;
}

したがって、基本的にスレッドは、計算コードに移動する前に、その依存関係が他のスレッドによって満たされるまで while ループにハングアップする必要があります。

「最初の」スレッドは、印刷時に依存関係が満たされていることを知っています

real i 1, real j 1
I need to wait for dependancy at i: 1 j: 0 and i: 0 j: 1
Is this true? 1

計算が完了すると、依存関係マトリックスの一部のセルが true に設定され、さらに 2 つのスレッドが while ループを通過し、カーネルがそこから移動できるようになります。

ただし、while ループのコメントを外すと、システム全体が約 10 秒間ハングし、

the launch timed out and was terminated

助言がありますか?

4

1 に答える 1