通过 host() 从 af::array 检索数据导致错误数据

Retrieving data from af::array via host() results in wrong data

尝试从 af::array (arrayfire) from the device via host(), my output data on the host is wrong (i.e. wrong values). For testing that, I wrote a small code sample (based on ) 检索数据时:

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。为什么会这样?

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 return 您在 local_data_ptr 缓冲区中的 1.0,尽管数据类型不同。