2015-03-10 3 views
1

Я пытаюсь изучить новые функции OpenCL 2.0, и я создал небольшое ядро ​​в попытке продемонстрировать очередь на стороне устройства. Ядро ниже:segfault из плохого ядра OpenCL 2.0

#pragma OPENCL EXTENSION cl_amd_printf : enable 

__kernel void call_me(__global int *a); 

__kernel void templateKernel(__global unsigned int * output, 
         __global unsigned int * input, 
         const  unsigned int multiplier); 


__kernel void call_me(__global int *a) 
{ 
//do nothing 
int id = get_global_id(0); 
//a[id] = b[id]; 
} 



__kernel void templateKernel(__global unsigned int * output, 
         __global unsigned int * input, 
         const  unsigned int multiplier) 
{ 
uint tid = get_global_id(0); 
int lid = get_local_id(0); 
int gid = get_group_id(0); 
int broadcast = 1; 
int global_size = get_global_size(0); 
if(gid == 0) { 
    broadcast = work_group_broadcast(5, 0); 
} 
int collection = work_group_scan_exclusive_add(broadcast); 


void (^kernel_block)(void) = ^{call_me(input);}; 
//output[tid] = input[tid] * multiplier + collection + broadcast; 
output[tid] = collection; 
//output[tid] = global_size; 
size_t size = 100; 
//printf("hey %d\n", broadcast); 
ndrange_t ndrange = ndrange_1D(size); 
queue_t default_queue = get_default_queue(); 
/* 
if(tid == 0){ 
    int status = enqueue_kernel(
     default_queue, 
     CLK_ENQUEUE_FLAGS_WAIT_KERNEL, 
     ndrange, 
     kernel_block    
     ); 
    } 
*/ 
} 

Это ядро, как предполагается, не делать ничего, кроме есть это будет успешный вызов в ядро, что не приводит к программе segfaulting. Что с этим не так? Ошибка сегментации удаляется при удалении вызова enqueue_kernel. Мой компилятор OpenCL C установлен в --cl-std = CL2.0 и подтвержден, что он работает, поскольку функции широковещания и сбора работают правильно.

Я использую бета-версию AMDAPPSDK 3.0. Любая помощь приветствуется.

+0

Это даже компиляция? Типичной проблемой может быть то, что вы передаете не скомпилированное ядро ​​в 'enqueueNDRangeKernel()', поэтому оно segfault, потому что указатель недействителен. Есть ли у вас какие-либо ошибки в вызове CL перед SEG_FAULT? – DarkZeros

+0

У меня есть проверки по пути для каждого вызова API. Они читают статус int. clBuildProgram возвращает все в порядке, а также все остальное до enqueueNDRangeKernel. Самое забавное, что в этом окне ubuntu при запуске ** watch -n 0.1 ./executable** сообщение о статусе программы сборки не отображается. – billyc59

ответ

2

Я решил свою проблему.

Проблема в том, что в OpenCL 2.0, вызов API для создания командных очередей clCreateCommandQueue() было устаревшее. Вместо этого AMD предлагает использовать новый вызов API clCreateCommandQueueWithProperties(), чтобы включить очереди на стороне устройства для вызовов ядра на стороне устройства.

В дополнение к использованию нового вызова API необходимо также сделать не менее двух командных очередей. Один для хоста и один для устройства. Очередь устройства выполняется на хосте, используя дополнительные свойства, которые входят в новый вызов API.

Смежные вопросы