2012-04-08 12 views
2

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!

+0

bekommen Sie den Rest des Quellcodes zeigen sollten - die Enqueue und SetArgs-Befehle. –

+0

Auf welcher Hardware läuft der Code speziell? – virtuallinux

Antwort

0

Hoffe die Menge an verfügbarem lokalen Speicher ist weniger für diese Arbeitsgruppengröße. Bitte können Sie die Argumente zeigen? . Sie können versuchen, indem Sie die Größe der Arbeitsgruppe reduzieren, beginnen mit 2,4,8,16,32,64,128, so stellen Sie sicher, dass seine Stärke von 2.

0

CL_KERNEL_WORK_GROUP_SIZE sagt Ihnen, wie groß die maximale Größe der Arbeitsgruppe für diese sein kann bestimmter Kernel. Die Laufzeit von OpenCL bestimmt dies, indem der Kernel-Code untersucht wird. CL_KERNEL_WORK_GROUP_SIZE ist eine Zahl kleiner oder gleich CL_DEVICE_MAX_WORK_GROUP_SIZE.

2

Apple OpenCL unterstützt keine Arbeitsgruppen, die größer als [1, 1, 1] auf der CPU sind. Ich habe keine Ahnung warum, aber so war es zumindest bis OSX 10.9.2. Größere Arbeitsgruppen sind auf der GPU jedoch in Ordnung.

+0

Dies ist jedoch eine Sache mit OSX. Unter Linux sind größere Arbeitsgruppengrößen bei der Ausführung auf der CPU in Ordnung. Unter Linux ist derselbe Code auch für mich 3,5 mal schneller. Ist OSX OpenCL einfach für CPU gebrochen? – Bram

0

Die Zeit ist vergangen seit der answer of Tomi und es scheint, dass Apple in diesem Aspekt etwas flexibler geworden ist. Auf meinem OS X 10.12.3 (immer noch OpenCL 1.2) können in der ersten Dimension bis zu CL_DEVICE_MAX_WORK_GROUP_SIZE verwendet werden.

Laut Spezifikation ist es auch möglich, die maximale Anzahl von Arbeitsgruppen für jede Dimension durch CL_DEVICE_MAX_WORK_ITEM_SIZES nach den documentation