В CUDA ядро ​​может обращаться к памяти неравномерно (случайно)? - PullRequest
0 голосов
/ 18 октября 2019

У меня есть, например, стопка изображений размером 100x200x500, и я хочу использовать, чтобы определить положение максимального значения каждого кадра (100x200) и вычесть небольшой патч из положения максимального значения. Я использую одно ядро ​​CUDA для каждого кадра. Возможно ли программирование? Большое спасибо заранее:)

__global__ void findFrameMaximum(float *I, bool *bw, float * threshold, signed long *MaxPosIndex, size_t *rows, size_t *cols, size_t *slices)
 {
    size_t threadID = blockIdx.x * THREADS_PER_BLOCK + threadIdx.x;
    signed long  currMaxPosIndex, ii;
    float I_Max_curr = *threshold;
    size_t pixelIdx;

    if(threadID >= (*slices))
        return;

    MaxPosIndex[threadID] = -1;
    for(ii=0; ii < (*rows) * (*cols); ii++) {
        pixelIdx = threadID * (*rows) * (*cols) + ii;
        if ((bw[pixelIdx]) && (I[pixelIdx] > I_Max_curr)) {
            I_Max_curr = I[pixelIdx];
            currMaxPosIndex = ii;
        }
    }
    if (I_Max_curr > (*threshold)) {
        MaxPosIndex[threadID] = currMaxPosIndex;
    }
    __syncthreads();
}

и

__global__ void RemoveOnePSF(float *I, size_t *rows, size_t *cols, size_t *slices, float *PSFInfo, size_t *PSFRadius, size_t *PSFsize, signed long *MaxPosIndex, unsigned long long *dOut)
{
    size_t threadID = blockIdx.x * THREADS_PER_BLOCK + threadIdx.x;
    size_t pixelIdx;
    long i_MaxPos, j_MaxPos, i, j, currPos, PSFpieceX0, PSFpieceY0;

    if(threadID >= (*slices))
        return;

    if(MaxPosIndex[threadID]>=0) {
        pixelIdx = threadID * (*rows) * (*cols) + MaxPosIndex[threadID];
        dOut[pixelIdx] = dOut[pixelIdx] + 1;

        i_MaxPos = pixelIdx % (*rows);  // Dim1
        j_MaxPos = pixelIdx / (*rows);  // Dim2

        PSFpieceX0 = (long int)i_MaxPos - (*PSFRadius);
        PSFpieceY0 = (long int)j_MaxPos - (*PSFRadius);

        for(j=0; j<(*PSFsize); j++) {
            if(((PSFpieceY0 + j)<0) || ((PSFpieceY0 + j)>= (*cols))) {
                continue;
            }
            for(i=0; i<(*PSFsize); i++) {
                if(((PSFpieceX0 + i)<0) || ((PSFpieceX0 + i)>= (*rows))) {
                    continue;
                } else {
                    currPos = (PSFpieceY0 + j) * (*rows) + (PSFpieceX0 + i);
                    I[currPos] = I[currPos] - PSFInfo[i+j*(*PSFsize)];
                }
            }
        }
    }
    __syncthreads();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...