2017-07-01 2 views
0

codes de noyau qui produisent l'erreur:erreur de CL_OUT_OF_RESOURCES est renvoyé par clEnqueueNDRangeKernel() avec parallélisme dynamique

__kernel void testDynamic(__global int *data) 
{ 
    int id=get_global_id(0); 
    atomic_add(&data[1],2); 
} 

__kernel void test(__global int * data) 
{ 
    int id=get_global_id(0); 
    atomic_add(&data[0],2); 
    if (id == 0) { 
     queue_t q = get_default_queue(); 
     ndrange_t ndrange = ndrange_1D(1,1); 
     void (^my_block_A)(void) = ^{testDynamic(data);}; 
     enqueue_kernel(q, CLK_ENQUEUE_FLAGS_WAIT_KERNEL, 
         ndrange, 
         my_block_A); 
    } 

} 

I testés ci-dessous code pour être sûr compilateur OpenCL 2.0 fonctionne.

__kernel void test2(__global int *data) 
{ 
    int id=get_global_id(0); 
    data[id]=work_group_scan_inclusive_add(id); 
} 

La fonction de balayage donne 0,1,3,6 comme sorties, donc les fonctions de réduction OpenCL 2.0 fonctionnent.

Le parallélisme dynamique est-il une extension de OpenCL 2.0? Si je supprime la commande enqueue_kernel, les résultats sont égaux aux valeurs attendues (en omettant le noyau enfant).

Appareil: Amd RX550, conducteur: 17.6.2

Y at-il une commande spéciale qui doit être exécuté sur le côté hôte, pour exécuter le noyau de l'enfant sur get_default_queue file d'attente? Pour l'instant, la file d'attente de commande est créée avec une manière OpenCL 1.2 comme ci-dessous:

commandQueue = cl::CommandQueue(context, device, CL_QUEUE_PROFILING_ENABLE, &err); 

Est-ce que get_default_queue() doivent être la même file d'attente de commande qui appelle le noyau parent? Demander cela parce que j'utilise la même file d'attente de commande pour télécharger des données à GPU, puis télécharger les résultats, dans une seule synchronisation.

Répondre

0

solution Déplacé de la question à répondre:

Edit: below API command was the solution:

commandQueue = cl::CommandQueue(context, device, 
    CL_QUEUE_ON_DEVICE| 
    CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE | 
    CL_QUEUE_ON_DEVICE_DEFAULT, &err); 

after creating this queue(only 1 per device), didn't use it for anything else and also the parent kernel is enqueued on any other host queue so it looks like get_default_queue() doesn't have to be the parent-calling queue.

Documentation says CL_INVALID_QUEUE_PROPERTIES will be thrown if CL_QUEUE_ON_DEVICE is specified but for my machine, dynamic parallelism works with it and doesn't throw that error(as the upper commandQueue constructor parameters).