gpt4 book ai didi

c - OpenCl 中的结构具有大量内存地址

转载 作者:行者123 更新时间:2023-11-30 17:03:15 27 4
gpt4 key购买 nike

我是 OpenCl 新手。我正在尝试在 OpenCl 中模拟 vector 。对此,我有以下结构:

#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 中模拟 malloc 函数,如下所示,它就像每个 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限制, vector 是否可以有这样的结构。我问这个问题是因为当我将一些项目插入 vector 对象时我的代码崩溃了。

例如,以下内核崩溃:

__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;
}

最佳答案

您的工作组中有多少项目?如果不止一个,什么可以防止共享(本地)数据上的竞争条件?如果没有它,你就不能指望它能工作。

这只是测试代码吗?因为内存使用似乎不受任何条件限制,在这种情况下,您最好将其设置为固定/静态而不是伪动态(这可能对 GPU 不太友好)。

关于c - OpenCl 中的结构具有大量内存地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36238940/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com