Получение данных из af::array через host() приводит к неправильным данным

При попытке получить данные из af::array (arrayfire) с устройства через host() мои выходные данные на хост неправильный (т. е. неправильные значения). Для проверки этого я написал небольшой пример кода (на основе https://stackoverflow.com/a/29212923/2546099). ):

int main(void) {  
    size_t vector_size = 16;
    af::array in_test_array = af::constant(1., vector_size), out_test_array = af::constant(0., vector_size);

    af_print(in_test_array);
    double *local_data_ptr = new double[vector_size]();

    for(int i = 0; i < vector_size; ++i)
        std::cout << local_data_ptr[i] << '\t';
    std::cout << '\n';
    in_test_array.host(local_data_ptr);
    for(int i = 0; i < vector_size; ++i)
        std::cout << local_data_ptr[i] << '\t';
    std::cout << '\n';
    delete[] local_data_ptr;
    out_test_array = in_test_array;
    af_print(out_test_array);
    return 0;
}

Мой вывод

in_test_array
[16 1 1 1]
    1.0000 
    1.0000 
    1.0000 
    1.0000 
    1.0000 
    1.0000 
    1.0000 
    1.0000 
    1.0000 
    1.0000 
    1.0000 
    1.0000 
    1.0000 
    1.0000 
    1.0000 
    1.0000 

0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0
0.007813        0.007813        0.007813        0.007813        0.007813        0.007813        0.007813        0.007813        0       0       0       0       0       0       0       0
out_test_array
[16 1 1 1]
    1.0000 
    1.0000 
    1.0000 
    1.0000 
    1.0000 
    1.0000 
    1.0000 
    1.0000 
    1.0000 
    1.0000 
    1.0000 
    1.0000 
    1.0000 
    1.0000 
    1.0000 
    1.0000

Почему половина значений указателя установлена ​​на 0.007813, а не все значения на 1? При изменении значения по умолчанию для in_test_array на 2 половина значений устанавливается на 2, а для 3 эти значения устанавливаются на 32. Почему это происходит?


person arc_lupus    schedule 08.06.2020    source источник


Ответы (1)


Типы данных между arrayfire и C конфликтуют.

Для плавающего использования:

af::array in_test_array = af::constant(1., vector_size), 
          out_test_array = af::constant(0., vector_size);
float *local_data_ptr = new float[vector_size]();

Для двойного использования:

af::array in_test_array = af::constant(1., vector_size, f64),
          out_test_array = af::constant(0., vector_size, f64)
double *local_data_ptr = new double[vector_size]();

В обоих приведенных выше случаях вы увидите, что arrayfire вернет вам 1.0 в буфере local_data_ptr, хотя и с другими типами данных.

person Willy    schedule 10.08.2020