我將數據存儲在char數組中,並且需要從中讀取float和int變量。 此代碼工作正常的CPU:OpenCL:在GPU上輸入類型
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,炭場只是替換了相同的內容。
如果你仍然有這個問題,你應該發佈更全面的源代碼。 – pmdj
添加完整的內核代碼。 – vgeclair
這些數據的對齊情況如何?基於float和int的項目是否與4個字節邊界對齊?否則,這可能是問題的根源。 – pmdj