У меня есть, например, стопка изображений размером 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();
}