F
Furtano
Gast
Hallo,
ich habe gelsen ,dass wenn man den Adress Space Qualifier in OpenCL Kernel von Global auf Local setzt, der Kernel schneller arbeiten kann.
Wenn ich allerdings die Variablen auf __local setze funktioniert das Programm nicht mehr.
Eigentlich müsste man sie doch auf Local setzen können, oder?
Weil im Kernel wird ja nur das Work Item aus der eigenen Work-Group aufgerufen.
Hier mein Kernel:
Danke
ich habe gelsen ,dass wenn man den Adress Space Qualifier in OpenCL Kernel von Global auf Local setzt, der Kernel schneller arbeiten kann.
Wenn ich allerdings die Variablen auf __local setze funktioniert das Programm nicht mehr.
Eigentlich müsste man sie doch auf Local setzen können, oder?
Weil im Kernel wird ja nur das Work Item aus der eigenen Work-Group aufgerufen.
Hier mein Kernel:
Code:
__kernel void stepSizeAnt(
__global float *antX,
__global float *antY,
__global float *newAntX,
__global float *newAntY,
__global int *targetX,
__global int *targetY,
__global float *resultX,
__global float *resultY,
__global int *lifeStadium,
__global int *speed,
__global int *pheromonMap
)
{
int gid = get_global_id(0);
resultX[gid] = 0;
resultY[gid] = 0;
if (lifeStadium[gid] == 1){
//newAntX[gid] = antX[gid];
//newAntY[gid] = antY[gid];
// Neuen Richtungsvektor berechnen (in Welche Richtung soll die Ameise laufen)
resultX[gid] = (targetX[gid]-newAntX[gid]);
resultY[gid] = (targetY[gid]-newAntY[gid]);
// Normvektor ausrechnen normalisieren
float norm = native_sqrt(pown(resultX[gid],2) + pown(resultY[gid],2));
// Richtungsvektor normalisieren
resultX[gid] = (resultX[gid] / norm);
resultY[gid] = (resultY[gid] / norm);
// Ameisenschritt machen
// neue Ameisenposition = Alte Position + (neue Schrittposition * Geschwindigkeit)
newAntX[gid] += (resultX[gid])*speed[gid];
newAntY[gid] += (resultY[gid])*speed[gid];
}
// Auf 2 Stellen runden
//newAntX[gid] += 0.5;
newAntX[gid] = (float)((int)(newAntX[gid]*10000))/10000;
//newAntY[gid] += 0.5;
newAntY[gid] = (float)((int)(newAntY[gid]*10000))/10000;
// Wenn die Ameise den Rand betritt
if (newAntX[gid] < 0 || newAntY[gid] < 0){
newAntX[gid] = 0;
newAntY[gid] = 0;
}
if (newAntX[gid] > 900 || newAntY[gid] > 900){
newAntX[gid] = 0;
newAntY[gid] = 0;
}
}
Danke