Hallo zusammen,
ich arbeite zur Zeit an einem kleinen Programm auf PC und Mac das OpenCL nutzen soll. Auf dem Mac (OpenCL 1.0) habe ich ein Problem, eigentlich 2, die ich überhaupt nicht verstehe:
(Hinweis: Die Kernels laufen auf dem PC auf CPU und GPU (sowohl Nvidia und ATI) einwandfrei, auf dem Mac laufen die Kernels bei CPU Nutzung auch einwandfrei)
Nr 1: OpenCL Kernel
void __kernel contrast(const uint sizex, const uint sizey, __global float* source, __global float* dest)
{
int x=get_global_id(0);
int y=get_global_id(1);
float4 color = {0.f, 0.f, 0.f, 0.f};
float param1=1.5f;
color = GetPixel(x, y, sizex, source);
color = color * param1; //<-- die Problemzeile, die auf Mac auf der Gpu dazu führt, dass das Bild immer Schwarz wird
color = clamp(color,0.0f,1.0f);
dest[(y*sizex + x)*3 + 0] = color.x;
dest[(y*sizex + x)*3 + 1] = color.y;
dest[(y*sizex + x)*3 + 2] = color.z;
}
Wenn ich die rote Zeile komponentenweise schreibe, läuft es, also:
color.x = color.x * param1;
color.y = color.y * param1;
color.z = color.z * param1;
Das würde bedeuten man kann auf der Mac-GPU unter OpenCL keine Vektor <--> Skalar Multiplikation machen?!
Nr 2: OpenCL Kernel
void __kernel MP_calcMandelbrot(const uint sizex, const uint sizey, __global float* source, __global float* dest)
{
int x=get_global_id(0);
int y=get_global_id(1);
float4 color = {0.f, 0.f, 0.f, 0.f};
float xmin=-2.1f, xmax= 1.0f, float ymin=-1.3f, ymax= 1.3f;
float xdelta=(xmax-xmin)/(float)sizex, ydelta=(ymax-ymin)/(float)sizey;
float xx,x1,y1;
int iteration;
itermax = 256;
float xp=xmin+x*xdelta;
float yp=ymin+y*ydelta;
x1=0.0f;
y1=0.0f;
for (iteration=1; iteration<itermax; iteration++)
{
xx = x1*x1-y1*y1+xp;
y1 = 2.0f*x1*y1+yp;
x1 = xx;
if (!(x1*x1+y1*y1<4.0f))
{
color.x=(float)iteration;
color.y=(float)iteration;
color.z=(float)iteration;
}
if (!(x1*x1+y1*y1<4.0f)) iteration=itermax; //<-- die Problemzeile
}
//Pixel schreiben
dest[y*sizex + x] = color;
}
Wenn ich die rote Zeile auskommentiere, funktioniert der Kernel, sobald ich sie einfüge, kommt überhaupt nichts mehr bei "dest[..]" an.
Eine While Schleife habe ich auch probiert, diverse varianten der Abbruchbedingungen, immer mit dem gleichen Ergebnis.
Hat irgendjemand eine Idee, was ich auf dem Mac bei GPU-Nutzung falsch mache?
Danke Euch!
ich arbeite zur Zeit an einem kleinen Programm auf PC und Mac das OpenCL nutzen soll. Auf dem Mac (OpenCL 1.0) habe ich ein Problem, eigentlich 2, die ich überhaupt nicht verstehe:
(Hinweis: Die Kernels laufen auf dem PC auf CPU und GPU (sowohl Nvidia und ATI) einwandfrei, auf dem Mac laufen die Kernels bei CPU Nutzung auch einwandfrei)
Nr 1: OpenCL Kernel
void __kernel contrast(const uint sizex, const uint sizey, __global float* source, __global float* dest)
{
int x=get_global_id(0);
int y=get_global_id(1);
float4 color = {0.f, 0.f, 0.f, 0.f};
float param1=1.5f;
color = GetPixel(x, y, sizex, source);
color = color * param1; //<-- die Problemzeile, die auf Mac auf der Gpu dazu führt, dass das Bild immer Schwarz wird
color = clamp(color,0.0f,1.0f);
dest[(y*sizex + x)*3 + 0] = color.x;
dest[(y*sizex + x)*3 + 1] = color.y;
dest[(y*sizex + x)*3 + 2] = color.z;
}
Wenn ich die rote Zeile komponentenweise schreibe, läuft es, also:
color.x = color.x * param1;
color.y = color.y * param1;
color.z = color.z * param1;
Das würde bedeuten man kann auf der Mac-GPU unter OpenCL keine Vektor <--> Skalar Multiplikation machen?!
Nr 2: OpenCL Kernel
void __kernel MP_calcMandelbrot(const uint sizex, const uint sizey, __global float* source, __global float* dest)
{
int x=get_global_id(0);
int y=get_global_id(1);
float4 color = {0.f, 0.f, 0.f, 0.f};
float xmin=-2.1f, xmax= 1.0f, float ymin=-1.3f, ymax= 1.3f;
float xdelta=(xmax-xmin)/(float)sizex, ydelta=(ymax-ymin)/(float)sizey;
float xx,x1,y1;
int iteration;
itermax = 256;
float xp=xmin+x*xdelta;
float yp=ymin+y*ydelta;
x1=0.0f;
y1=0.0f;
for (iteration=1; iteration<itermax; iteration++)
{
xx = x1*x1-y1*y1+xp;
y1 = 2.0f*x1*y1+yp;
x1 = xx;
if (!(x1*x1+y1*y1<4.0f))
{
color.x=(float)iteration;
color.y=(float)iteration;
color.z=(float)iteration;
}
if (!(x1*x1+y1*y1<4.0f)) iteration=itermax; //<-- die Problemzeile
}
//Pixel schreiben
dest[y*sizex + x] = color;
}
Wenn ich die rote Zeile auskommentiere, funktioniert der Kernel, sobald ich sie einfüge, kommt überhaupt nichts mehr bei "dest[..]" an.
Eine While Schleife habe ich auch probiert, diverse varianten der Abbruchbedingungen, immer mit dem gleichen Ergebnis.
Hat irgendjemand eine Idee, was ich auf dem Mac bei GPU-Nutzung falsch mache?
Danke Euch!
Zuletzt bearbeitet: