6

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

  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. 有没有一种简单的方法可以将数组序列化/反序列化到磁盘?我没有看到这样做的方法,并且由于我无法将这些值作为标准类型取回,因此我不确定如何将其保存。

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

4

1 回答 1

5

下面的答案:

  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 页面。

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

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

于 2015-03-23T14:32:27.507 回答