2016-06-11 11 views
-4

parallelisieren Wie für Schleifen in CUDA
bei dct vier verschachtelten parallelisieren ich habe vier verschachtelte for-Schleifen möchte ich meine dct Funktion in CUDA-Codewie dct (für Schleifen) in CUDA

for(y = 0; y < HEIGHT; y+=BLOCK_H) { 
for(x = 0; x < WIDTH; x+= BLOCK_W) { 
for(i = 0; i < BLOCK_H; i++) { 
for(j = 0; j < BLOCK_W; j++) { 
block_in[i][j] = cur_frame[(x+j)+(WIDTH*(y+i))]; 
} 
} 
} 
} 
+1

Denken Sie Daten, keine Schleifen. Und lies Tutorials. – Drop

+0

[Hier ist] (http://stackoverflow.com/questions/37708101/parallelize-four-and-more-nested-loops-with-cuda) eine Frage, die fragt, wie verschachtelte Schleifen parallelisiert werden. [Hier ist] (http://stackoverflow.com/questions/34529387/kernel-for-processing-a-4tens-in-cuda-) ein anderes. –

Antwort

2

Es ist ein White Paper von Nvidia, Obukov und Kharlamov: Discrete Cosine Transform for 8x8 Blocks with CUDA das geht mit dct8x8 in der CUDA samples. Sie sollten sich beide ansehen.

+0

Ich lese das, aber ich habe nicht verstanden, wie sie diese Zeile in C tun SubroutineDCTvector ((float *) fSrc + (i + k) * Schritt + j, 1, fDst + (i + k) * Stride + j , 1); –

+0

Und das in Cuda int OffsThreadInRow = threadIdx.y * BLOCK_SIZE + threadIdx.x; int OffsThreadInCol = threadIdx.z * BLOCK_SIZE; src + = FMUL (blockIdx.y * KER2_BLOCK_HEIGHT + OffsThreadInCol, ImgStride) + blockIdx.x * KER2_BLOCK_WIDTH + OffsThreadInRow; dst + = FMUL (blockIdx.y * KER2_BLOCK_HEIGHT + OffsThreadInCol, ImgStride) + blockIdx.x * KER2_BLOCK_WIDTH + OffsThreadInRow; float * bl_ptr = Block + OffsThreadInCol * KER2_SMEMBLOCK_STRIDE + OffsThreadInRow; –