2017-08-26 3 views
-1

配列の長さが異なり、各シーケンスが '>'で終わる配列を持っています。 seq = [a、b、f、g、c、d、>、b、g、d、> ....]私は各シーケンスの長さを計算し、seq_length = [6,3,5、...]という別の配列に格納しました。次に、排他スキャンを使用してオフセットを計算し、offset = [0、6、9、..]という配列に格納します。ブロックはシーケンスgpuの異なる長さを読み取ります

私が望むのは、各ブロックがオフセット値を使って配列seq []から配列を読み上げることです。たとえば、ブロック0はseq [0]から始まり、長さが6のときに終了するシーケンスを読み取り、ブロック1はseq [6]から始まるシーケンスを読み取り、長さが3のときに停止します。 私はCUDAでこれをどのように行うことができますか?どのようにして各ブロックが異なるi番目の配列エントリ(配列seq [])から読み込むことができるか。

は、事前にありがとう:) CUDAはスレッドがであることをブロックする、ブロック内の各スレッドを識別threadIdx.xblockIdx.xなどのbuilt-in variablesを持ち、かつ

答えて

0

。ブロック内のすべてのスレッドが同じblockIdx.x値を持つことになり、ブロック内の各スレッドは異なる/ユニーク(ブロック単位)threadIdx.x値を持ちます。

したがって、blockIdx.xを使用して、ブロックごとに特定のシーケンスを選択することができます。この変数を使用すると、正しいシーケンス長と各シーケンス/ブロックのオフセットを選択できます。

ブロックごとに1つのスレッドを各シーケンス項目/文字に割り当てることができます。 threadIdx.xを使用して、各スレッドについて、どのシーケンスメンバーを選択すべきかを特定することができます。ここで

完全に例を働いている:

$ cat t405.cu 
#include <stdio.h> 

__global__ void tk(char *seq, int *offsets, int *seq_lengths, int num_seq){ 

    if (blockIdx.x < num_seq) 
    if (threadIdx.x < seq_lengths[blockIdx.x]) 
    printf("block: %d, thread: %d, seq: %c\n", blockIdx.x, threadIdx.x, seq[offsets[blockIdx.x]+threadIdx.x]); 
} 

int main(){ 

    char seq[] = {'a','b','f','g','c','d','>','b','g','d','>','a','b', 'c', 'd', 'e', '>'}; 
    int seq_length[] = { 6, 3, 5 }; 
    int offsets[] = { 0, 7, 11 }; 
    int num_seq = 3; 

    int seq_sz = sizeof(seq); 
    int seq_l_sz = sizeof(seq_length); 
    int off_sz = sizeof(offsets); 

    char *d_seq; 
    int *d_seq_length, *d_offsets; 
    cudaMalloc(&d_seq, seq_sz); 
    cudaMalloc(&d_seq_length, seq_l_sz); 
    cudaMalloc(&d_offsets, off_sz); 

    cudaMemcpy(d_seq, seq, seq_sz, cudaMemcpyHostToDevice); 
    cudaMemcpy(d_seq_length, seq_length, seq_l_sz, cudaMemcpyHostToDevice); 
    cudaMemcpy(d_offsets, offsets, off_sz, cudaMemcpyHostToDevice); 
    tk<<<num_seq, 1024>>>(d_seq, d_offsets, d_seq_length, num_seq); 
    cudaDeviceSynchronize(); 
    cudaError_t err = cudaGetLastError(); 
    if (cudaSuccess != err) printf("cuda error: %s\n", cudaGetErrorString(err)); 
    return 0; 
} 

$ nvcc -arch=sm_61 -o t405 t405.cu 
$ ./t405 
block: 1, thread: 0, seq: b 
block: 1, thread: 1, seq: g 
block: 1, thread: 2, seq: d 
block: 2, thread: 0, seq: a 
block: 2, thread: 1, seq: b 
block: 2, thread: 2, seq: c 
block: 2, thread: 3, seq: d 
block: 2, thread: 4, seq: e 
block: 0, thread: 0, seq: a 
block: 0, thread: 1, seq: b 
block: 0, thread: 2, seq: f 
block: 0, thread: 3, seq: g 
block: 0, thread: 4, seq: c 
block: 0, thread: 5, seq: d 
$ 

あなたが順番に1024文字以上を期待するならば、あなたはおそらく、各スレッドが複数の文字を処理持つように、上記を変更したいと思う、多分にループ。

関連する問題