2016-03-26 2 views
0

Я новичок в OpenCl. Я пытаюсь имитировать вектор в OpenCl. В связи с этим, у меня есть следующие структуры:Наличие больших массивов адресов памяти для структур в OpenCl

#define VECTOR_INIT_CAPACITY 126 
typedef struct { 
    int capacity; 
    int total; 
    __local void* items[VECTOR_INIT_CAPACITY]; 
} vector; 

void vector_init(vector *v){ 
    v->capacity = VECTOR_INIT_CAPACITY; 
    v->total = 0; 
} 

int vector_total(vector *v) { 
    return v->total; 
} 

void vector_add(vector *v, __local void* item) { 
    v->items[v->total] = item; 
    v->total++; 
} 

__local void* vector_get( vector *v, int index) { 
    if (index >= 0 && index < v->total) 
     return (v->items[index]); 
    return NULL; 
} 

Я также должен сказать, что из-за проект я работаю, я должен был имитировать функцию таНоса в OpenCL следующим образом, который работает как локальная куча для каждого GPU ядра:

typedef struct /*__attribute__((__packed__))*/{ 
    __local 
    byte* ptr; 
    int next; 
}Heap; 

__local void* malloc_(__local Heap *heap, int size) { 

    uint old = heap->next; 
    heap->next = heap->next + size; 
    return heap->ptr + old; 
} 

что касается выравнивания структуры и OpenCL ограничений, можно ли иметь такую ​​структуру вектора. Я задаю этот вопрос, так как мой код падает, когда я вставляю некоторые элементы в векторный объект.

Например, следующие аварии ядра:

__kernel void packet_routing(__global byte* heap_, __global uint* next, __global byte* headers,__global int* packet_begining_index, 
         __global int* packet_length,__global uint* test_result){ 

    int gid = get_global_id(0); 

    __local byte local_heap[50000]; 

    __local Heap heap ; 
    heap.ptr = local_heap; 
    heap.next = 0;//gid*MAX_HEAP_SIZE_FOR_EACH_KERNEL; 

    vector layers; 

    vector_init(&layers); 
    for (int i = 0 ; i < 120; i ++){ 
     __local int *x = malloc_(&heap,sizeof(int)); 
     *x = i; 
     vector_add(&layers,(__local void*)x); 
    } 

    __local int *z = (__local int*) vector_get(&layers,0); 
    test_result[gid] = *z; 
} 
+0

векторные слои; для каждого потока, потому что не имеет локального ключевого слова перед тем, чтобы каждый поток имел свою собственную версию ?. x не для потока, он является общим. –

ответ

0

Сколько деталей в вашей рабочей группе? Если более одного, что препятствует условиям гонки на общих (локальных) данных? Без этого вы не можете ожидать, что это сработает.

Это просто тестовый код? Поскольку использование памяти не кажется условным ни на что, и в этом случае вам лучше было бы сделать его фиксированным/статическим или псевдодинамическим (что, вероятно, не очень удобно для GPU).

+0

Спасибо за ваш ответ. В каждой рабочей группе есть только один элемент; поэтому, нет расовой принадлежности. И yup. Это всего лишь тестовый код. Мой основной код намного сложнее, поскольку определенная функция malloc_ часто уходит. –

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