gpt4 book ai didi

c - OpenCL:GPU 上的类型转换

转载 作者:行者123 更新时间:2023-12-02 03:03:06 26 4
gpt4 key购买 nike

我将数据存储在一个 char 数组中,我需要从那里读取 float 和 int 变量。此代码在 CPU 上运行良好:

global float *p;
p = (global float*)get_pointer_to_the_field(char_array, index);
*p += 10;

但在 GPU 上我得到错误 -5:CL_OUT_OF_RESOURCES。读数本身有效,但对值进行某些操作(在本例中加 10)会导致错误。我该如何解决?

更新:

这适用于 GPU:

float f = *p;
f += 10;

但是,我仍然无法将这个值写回数组。

这是内核:

global void write_value(global char *data, int tuple_pos, global char *field_value, 
int which_field, global int offsets[], global int *num_of_attributes) {

int tuple_size = offsets[*num_of_attributes];
global char *offset = data + tuple_pos * tuple_size;
offset += offsets[which_field];

memcpy(offset, field_value, (offsets[which_field+1] - offsets[which_field]));
}

global char *read_value(global char *data, int tuple_pos,
int which_field, global int offsets[], global int *num_of_attributes) {
int tuple_size = offsets[*num_of_attributes];
global char *offset = data + tuple_pos * tuple_size;
offset += offsets[which_field];
return offset;
}

kernel void update_single_value(global char* input_data, global int* pos, global int offsets[],
global int *num_of_attributes, global char* types) {
int g_id = get_global_id(1);
int attr_id = get_global_id(0);
int index = pos[g_id];

if (types[attr_id] == 'f') { // if float

global float *p;
p = (global float*)read_value(input_data, index, attr_id, offsets, num_of_attributes);
float f = *p;
f += 10;
//*p += 10; // not working on GPU
}
else if (types[attr_id] == 'i') { // if int
global int *p;
p = (global int*)read_value(input_data, index, attr_id, offsets, num_of_attributes);
int i = *p;
i += 10;
//*p += 10;
}
else { // if char
write_value(input_data, index, read_value(input_data, index, attr_id, offsets, num_of_attributes), attr_id, offsets, num_of_attributes);
}
}

它更新表的元组的值,int 和 float 增加 10,char 字段只是替换为相同的内容。

最佳答案

您是否启用了 byte_addressable_store extension ?据我所知,按字节写入全局内存在 OpenCL 中没有明确定义,除非您启用它。 (您需要检查您的实现是否支持扩展。)

您可能还想考虑在内核参数中使用“正确”类型 - 这可能有助于编译器生成更高效的代码。如果类型可以动态变化,您或许可以尝试使用 union 类型(或结构类型中的 union 字段),尽管我自己还没有使用 OpenCL 对此进行测试。

关于c - OpenCL:GPU 上的类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44609742/

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