Here is my structure :
struct Pixel {int r, c;};
struct EdgeSegment {
Pixel *pixels;
int noPixels;
};
struct EdgeMap {
public:
EdgeSegment *segments;
int noSegments;
public:
// constructor
EdgeMap(int capacity){
segments = new EdgeSegment[capacity];
noSegments = 0;
} //end-EdgeMap
// Destructor
~EdgeMap(){delete segments;}
};
And my serial code is here :
void Segments2Lines(EdgeSegment segments, int noSegments, EDLines lines){
double x;
double y;
x = (double)malloc(WIDTH+HEIGHT8);
y = (double)malloc(WIDTH+HEIGHT8);
for (int segmentNo=0; segmentNo<noSegments; segmentNo++){
for(int i=0; i<segments[segmentNo].noPixels; i++){
x[i]=segments[segmentNo].pixels[i].c;
y[i]=segments[segmentNo].pixels[i].r;
}
SplitSegment2Lines(x, y, segments[segmentNo].noPixels, segmentNo, lines);
}
free(x);
free(y);
}
Is the above code like the following version of the kernel?
global void Segments2LinesKernel(EdgeSegment *segments, double *d_x, double *d_y, EDLines *lines){
shared double *x, *y;
int i = blockIdx.x * blockDim.x + threadIdx.x;
int nopixels = segments[i].noPixels;
boolean b = true;
int count = 0;
while (b){
x[i]=segments[i].pixels[count].c;
y[i]=segments[i].pixels[count].r;
if (count < nopixels) count++;
else b = false;
SplitSegment2LinesKernel(x, y, segments[i].noPixels, i, lines);
}
}