2016-07-24 1 views
3

Я пытаюсь заполнить 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; 
+0

Можете ли вы попробовать другим способом инициализации 'default_hashmap_pattern'? Я вижу очевидную ошибку в коде. Также проверьте код ошибки ReadBuffer – DarkZeros

+1

@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

+0

Почему вы не используете массив вместо структуры? Да, вашей целью может быть использование структуры, но по крайней мере вы можете проверить, связана ли проблема с enqueueFillBuffer или нет. –

ответ

0

Проблема заключается в том, что ваш шаблон заполнения больше слишком велик для вашего GPU. Я столкнулся с той же проблемой, пытаясь заполнить шаблон cl_double, который имеет 64 бита, как ваш cl_int2. Я думаю, clEnqueueFillBuffer вызывает встроенное ядро, которое не позволяет шаблоны

0

Я могу воспроизвести это. На Macbook Sierra, с Radeon Pro 450, следующий сценарий:

int N = 100000; 

float *a = new float[N]; 

cl_mem a_gpu = clCreateBuffer(context, CL_MEM_READ_WRITE, N * sizeof(float), 0, &err); 
checkError(err); 
for(int it = 0; it < 100; it++) { 

    float value = 123.0f + it; 
    err = clEnqueueFillBuffer(queue, a_gpu, &value, sizeof(value), 0, N * sizeof(float), 0, 0, 0); 
    checkError(err); 
    clFinish(queue); 

    err = clEnqueueReadBuffer(queue, a_gpu, CL_TRUE, 0, 
             sizeof(cl_float) * N, a, 0, NULL, NULL); 
    checkError(err); 
    clFinish(queue); 

    cout << it << " a[N - 1]=" << a[N - 1] << endl; 
} 
delete[] a; 

дает результаты, как:

Using Apple , OpenCL platform: Apple Using OpenCL device: AMD Radeon Pro 450 Compute Engine 0 a[N - 1]=-1.39445e-31 1 a[N - 1]=0 2 a[N - 1]=0 3 a[N - 1]=0 4 a[N - 1]=0 5 a[N - 1]=0 6 a[N - 1]=129 7 a[N - 1]=0 8 a[N - 1]=131 9 a[N - 1]=132 10 a[N - 1]=133 11 a[N - 1]=134 12 a[N - 1]=135 13 a[N - 1]=0 14 a[N - 1]=0 15 a[N - 1]=0 16 a[N - 1]=0 17 a[N - 1]=0 18 a[N - 1]=0 19 a[N - 1]=0 20 a[N - 1]=0 21 a[N - 1]=0 22 a[N - 1]=0 23 a[N - 1]=0 24 a[N - 1]=0 25 a[N - 1]=0 26 a[N - 1]=0 27 a[N - 1]=0 28 a[N - 1]=0 29 a[N - 1]=0 30 a[N - 1]=0 31 a[N - 1]=154 32 a[N - 1]=0

Смежные вопросы