Я новичок в 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;
}
векторные слои; для каждого потока, потому что не имеет локального ключевого слова перед тем, чтобы каждый поток имел свою собственную версию ?. x не для потока, он является общим. –