从 arrayfire 数组中检索值作为标准类型和序列化

Retrieving values from arrayfire array as standard types and serialization

我最近在 GTC 上看到了 arrayfire 的演示,我想我会尝试一下。以下是我在尝试使用它时 运行 遇到的一些问题。我 运行ning Visual Studio 2013 在 Windows 7 系统上使用来自 AMD App SDK 2.9-1 的 OpenCL。

  1. 最大的挫折是我无法在调试器中查看数组对象的状态,看里面有什么数据。我必须依赖 af_print 语句。这很烦人。有什么方法可以配置调试器让我看到数组中的数据而不必打印出来吗?

  2. 将数据放入数组后,如何取回标准数据类型的值。一个例子如下所示。我正在尝试将元素 5,0 作为双精度返回。示例中的行不起作用,我无法将其转换为任何标准类型。我唯一可以分配给它的是另一个数组。如何取回我的数据?

    array test = constant(0, dim4(10, 2));
    test(span, 1) = 10.5;
    double val = test(5, 0);  //This does not compile. 
  1. 有没有一种简单的方法可以serialize/deserialize 将阵列写入磁盘?我没有找到执行此操作的方法,并且由于我无法将值作为标准类型取回,所以我不确定如何将其保存。

  2. 我正在查看您提供的降雨教程示例,但它似乎给出了不正确的结果。例如,第 52 行有这个打印语句 "af_print(rainfall);." 它应该打印出每个站点的降雨量,但它里面全是 8,这是不正确的。我对 cpu 和 opencl 版本都进行了尝试,得到了相同的结果。其他一些计算也不正确。代码看起来应该是正确的,这是错误还是代码错误?

以下答案:

  1. 因为 ArrayFire 的所有数据都驻留在 GPU 上,所以不可能在 VS 调试器上显示它(没有更先进的技术,涉及 NSight 或其他调试工具)。另一种方法是将数据取回主机,然后在调试器中检查它(如答案 2)。

  2. host() 函数允许您将数据检索回主机。有两种方法可以做到这一点:

    // Type 1
    array a = randu(3, f32);
    float *host_a = a.host<float>();        // must call array::free() later
    printf("host_a[2] = %f\n", host_a[2]);  // last element
    af::freeHost(host_a);
    
    // Type 2
    array a = randu(3, f32);
    float *host_a = new float[3];
    a.host(host_a);
    printf("host_a[2] = %f\n", host_a[2]);  // last element
    delete [] host_a;
    
  3. <<(ostream 运算符)为数组和 dim4 重载。所以做 std::cout << array << std::endl; 会打印到屏幕上。同样可以用于 fstream 对象。

  4. 我们正在调查降雨情况,会回来的。这应该在今天修复。请关注我们的 github 页面。

--编辑-- 4. https://github.com/arrayfire/arrayfire/pull/531修复了降雨中出现的问题。我们将很快发布新版本。

编辑 2:将 af::free 更改为 af::freeHost 以删除 ArrayFire 分配的主机内存。