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.