wrx

04-28-2011, 01:00 AM

Hi,

I'm working on image processing and I try to do median filter where we use sort.

My median.cl file structure is as following :

#define TYPE int

#define FILTERSIZE 1000

#define MAX FILTERSIZE

void quickSort(int *array, int length)//non-recursive algorithm

{

int piv, begin[MAX], end[MAX];

int i=0 ;

....

//quick sort

}

void Sort(TYPE *tab, int tailleTableau){ //bubble sort

int i, k;

TYPE temp;

for(k = 0; k < (tailleTableau/2)+1; k++) {

for(i = 0; i < tailleTableau-1; i++) {

if(tab[i] > tab[i+1])

{

temp=tab[i];

tab[i]=tab[i+1];

tab[i+1]=temp;

}

}

}

}

__kernel void median(__global const TYPE *inputBuffer,

__global TYPE *outputBuffer,

__global const int *filterIndex,

const int filterIndexSize,

const int InputBufferSize)

{

unsigned int x = get_global_id(0);

TYPE pixel;

unsigned int i;

long offsetIndex;

TYPE neighborhood[FILTERSIZE];

pixel = 0;

for(i=0; i< filterIndexSize; i++)

{

offsetIndex = x + filterIndex[i];

if(offsetIndex >= 0 && offsetIndex < InputBufferSize ) // in image buffer bound

{

neighborhood[i] = inputBuffer[offsetIndex];

}

}

// Sort(neighborhood, filterIndexSize);

quickSort(neighborhood, filterIndexSize);

pixel = neighborhood[(int)(filterIndexSize/2)];

outputBuffer[x] = pixel;

}

Some little median values works, some others not. I have clEnqueueReadBuffer : CL_INVALID_COMMAND_QUEUE(-36) error.

How can I fixe this issue? Is it an allocation faillure on GPU? Too big allocation on sort function?

Note that sort algorithms are tested and work well. Kernel works well too without call to sort function.

Thanks.

I'm working on image processing and I try to do median filter where we use sort.

My median.cl file structure is as following :

#define TYPE int

#define FILTERSIZE 1000

#define MAX FILTERSIZE

void quickSort(int *array, int length)//non-recursive algorithm

{

int piv, begin[MAX], end[MAX];

int i=0 ;

....

//quick sort

}

void Sort(TYPE *tab, int tailleTableau){ //bubble sort

int i, k;

TYPE temp;

for(k = 0; k < (tailleTableau/2)+1; k++) {

for(i = 0; i < tailleTableau-1; i++) {

if(tab[i] > tab[i+1])

{

temp=tab[i];

tab[i]=tab[i+1];

tab[i+1]=temp;

}

}

}

}

__kernel void median(__global const TYPE *inputBuffer,

__global TYPE *outputBuffer,

__global const int *filterIndex,

const int filterIndexSize,

const int InputBufferSize)

{

unsigned int x = get_global_id(0);

TYPE pixel;

unsigned int i;

long offsetIndex;

TYPE neighborhood[FILTERSIZE];

pixel = 0;

for(i=0; i< filterIndexSize; i++)

{

offsetIndex = x + filterIndex[i];

if(offsetIndex >= 0 && offsetIndex < InputBufferSize ) // in image buffer bound

{

neighborhood[i] = inputBuffer[offsetIndex];

}

}

// Sort(neighborhood, filterIndexSize);

quickSort(neighborhood, filterIndexSize);

pixel = neighborhood[(int)(filterIndexSize/2)];

outputBuffer[x] = pixel;

}

Some little median values works, some others not. I have clEnqueueReadBuffer : CL_INVALID_COMMAND_QUEUE(-36) error.

How can I fixe this issue? Is it an allocation faillure on GPU? Too big allocation on sort function?

Note that sort algorithms are tested and work well. Kernel works well too without call to sort function.

Thanks.