So laufe ich immer wieder auf seltsame Fehler, wenn ich meine Kernel anrufe; Die angegebene max. Größe der Kernarbeitsgruppe ist eins, während die Arbeitsgruppengröße meines Geräts (mein Macbook) entschieden höher ist. Welche möglichen Ursachen könnte es geben, dass die Kernel den Code auf eine einzige Arbeitsgruppe beschränken? Hier ist eine meiner Kerne:OpenCL-Kernel Arbeitsgruppegröße Einschränkung
__kernel
void termination_kernel(const int Elements,
__global float* c_I,
__global float* c_Ihat,
__global float* c_rI,
__local float* s_a)
{
const int bdim = 128;
int n = get_global_id(0);
const int tx = get_local_id(0); // thread index in thread-block (0-indexed)
const int bx = get_group_id(0); // block index (0-indexed)
const int gx = get_num_groups(0);
// is thread in range for the addition
float d = 0.f;
while(n < Elements){
d += pow(c_I[n] - c_Ihat[n], 2);
n += gx * bdim;
}
// assume bx power of 2
int alive = bdim/2;
s_a[tx] = d;
barrier(CLK_LOCAL_MEM_FENCE);
while(alive > 1){
if(tx < alive)
s_a[tx] += s_a[tx + alive];
alive /= 2;
barrier(CLK_LOCAL_MEM_FENCE);
}
if(tx == 0)
c_rI[bx] = s_a[0] + s_a[1];
}
und der Fehler zurückgegeben wird
OpenCL Error (via pfn_notify): [CL_INVALID_WORK_GROUP_SIZE] : OpenCL Error : clEnqueueNDRangeKernel
failed: total work group size (128) is greater than the device can support (1)
OpenCL Error: 'clEnqueueNDRangeKernel(queue, kernel_N, dim, NULL, global_N, local_N, 0, NULL, NULL)'
Ich weiß, es sagt die Beschränkung auf das Gerät, aber das Debuggen zeigt, dass
CL_DEVICE_MAX_WORK_GROUP_SIZE = 1024
und
CL_KERNEL_WORK_GROUP_SIZE = 1
Der Kernel Nachteile truction wird von
char *KernelSource_T = readSource("Includes/termination_kernel.cl");
cl_program program_T = clCreateProgramWithSource(context, 1, (const char **) &KernelSource_T, NULL, &err);
clBuildProgram(program_T, 1, &device, flags, NULL, NULL);
cl_kernel kernel_T = clCreateKernel(program_T, "termination_kernel", &err);
aufgerufen Ich würde die aufrufende Funktion enthalten, aber ich bin mir nicht sicher, ob es relevant ist; Meine Intuition ist, dass es etwas im Kernel-Code ist, der die Beschränkung erzwingt. Irgendwelche Ideen? Vielen Dank im Voraus für die Hilfe!
bekommen Sie den Rest des Quellcodes zeigen sollten - die Enqueue und SetArgs-Befehle. –
Auf welcher Hardware läuft der Code speziell? – virtuallinux