Я пытаюсь заполнить OpenCL cl_int2
буфер со значениями по умолчанию ({-1, -2}
), однако функция OpenCL clEnqueueFillBuffer()
заполняет мой буфер с различных значений каждый раз, когда я запустить его - буфер заполняется ожидаемыми значениями только случайным образом. Функция возвращает код ошибки 0
.`clEnqueueFillBuffer()` заполняет буфер правильно только в случайном порядке
Примеры вывода сниппета в в нескольких прогонов:
0 : -268435456
0 : -2147483648
0 : -536870912
0 : 268435456
0 : 0
0 : -1342177280
-1: -2
Я бегу OS X 10.11.6 с Radeon HD 6750M и OpenCL версии 1.2.
clbParticle_hashmap_lookup_table = clCreateBuffer(context,
CL_MEM_READ_WRITE,
sizeof(cl_int2)*this->CUBE_CELLS,
nullptr,
&err_code);
// ...
cl_int2 default_hashmap_pattern = { .s = {-1, -2} };
clEnqueueFillBuffer(queue,
clbParticle_hashmap_lookup_table,
&default_hashmap_pattern,
sizeof(cl_int2),
0,
sizeof(cl_int2)*this->CUBE_CELLS,
0,
nullptr, nullptr);
clFinish(queue);
// copy and print the data:
size_t hashmap_lookup_table_size = sizeof(cl_int2)*this->CUBE_CELLS;
cl_int2* hashmap_lookup_table_bytes = (cl_int2*) malloc(hashmap_lookup_table_size);
clEnqueueReadBuffer(queue,
clbParticle_hashmap_lookup_table,
CL_TRUE,
0,
hashmap_lookup_table_size,
hashmap_lookup_table_bytes,
0,
nullptr, nullptr);
clFinish(queue);
cout << endl << "Lookup table: " << endl;
for (int i=0; i<this->CUBE_CELLS; i++)
cout << setw(10) << hashmap_lookup_table_bytes[i].s[0] << " : "
<< setw(10) << hashmap_lookup_table_bytes[i].s[1] << endl;
Можете ли вы попробовать другим способом инициализации 'default_hashmap_pattern'? Я вижу очевидную ошибку в коде. Также проверьте код ошибки ReadBuffer – DarkZeros
@DarkZeros 'clEnqueueReadBuffer()' возвращает '0'. Я пробовал эти инициализации 'default_hashmap_pattern', однако ни одна из них не решила проблему; 1) 'cl_int2 default_hashmap_pattern = {-1, -2};' 2) 'cl_int2 default_hashmap_pattern; default_hashmap_pattern.s [0] = -1; default_hashmap_pattern.s [1] = -2; ' – sarasvati
Почему вы не используете массив вместо структуры? Да, вашей целью может быть использование структуры, но по крайней мере вы можете проверить, связана ли проблема с enqueueFillBuffer или нет. –