Я пытаюсь реализовать преобразование Hough для кругов в OpenCL, но я столкнулся с действительно странной проблемой. Каждый раз, когда я запускаю ядро Hough, я получаю немного другой аккумулятор, хотя параметры одинаковы, а аккумулятор всегда представляет собой свежую нулевую таблицу (например, http://imgur.com/a/VcIw1). Мой код ядра, как показано ниже:Преобразование Hough и OpenCL
#define BLOCK_LEN 256
__kernel void HoughCirclesKernel(
__global int* A,
__global int* imgData,
__global int* _width,
__global int* _height,
__global int* r
)
{
__local int imgBuff[BLOCK_LEN];
int localThreadIndex = get_local_id(0); //threadIdx.x
int globalThreadIndex = get_local_id(0) + get_group_id(0) * BLOCK_LEN; //threadIdx.x + blockIdx.x * Block_Len
int width = *_width; int height = *_height;
int radius = *r;
A[globalThreadIndex] = 0;
barrier(CLK_GLOBAL_MEM_FENCE);
if(globalThreadIndex < width*height)
{
imgBuff[localThreadIndex] = imgData[globalThreadIndex];
barrier(CLK_LOCAL_MEM_FENCE);
if(imgBuff[localThreadIndex] > 0)
{
float s1, c1;
for(int i = 0; i<180; i++)
{
s1 = sincos(i, &c1);
int centerX = globalThreadIndex % width + radius * c1;
int centerY = ((globalThreadIndex - centerX)/height) + radius * s1;
if(centerX < width && centerY < height)
atomic_inc(A + centerX + centerY * width);
}
}
}
barrier(CLK_GLOBAL_MEM_FENCE);
}
Может ли это быть ошибкой, как я приращение аккумулятора?
Пожалуйста, отправьте пример запуска, воспроизводящий вашу ошибку. Моя попытка писать одна работает нормально и каждый раз дает тот же результат, но, конечно, что-то может происходить в той части, которую вы нам не показываете.Кстати, вы можете просто передать 'height',' width' и 'r' в качестве скаляров, не нужно использовать 1-элементные массивы. – fjarri
P.S. Если это возможно, проверьте свою программу на другом устройстве. Кроме того, [здесь попытка воспроизведения] (https://gist.github.com/fjarri/aee7b1d3a24bcf20e7e1) с использованием Python с 'numpy',' matplotlib' и 'pyopencl'. – fjarri
Я загрузил целое решение здесь http://speedy.sh/m5ZXn/Hough.7z Кажется странным, потому что мой другой проект, который является нерегулярным преобразованием Хафа, кажется, работает очень хорошо, и круги основаны на нем. – CoreMeltdown