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

时间:2015-03-23 12:21:17

标签: gpgpu arrayfire

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

  1. 最大的挫败感是我无法在调试器中查看数组对象的状态以查看其中包含的数据。我必须依赖af_print语句。这非常烦人。有没有办法配置调试器让我看到数组中的数据而不必打印出来?

  2. 在数组中存储数据之后,如何将值作为标准数据类型返回。一个例子如下所示。我试图将元素5,0作为双重回归。示例中的行不起作用,我无法将其强制转换为任何标准类型。我唯一可以指定的是另一个数组。如何取回我的数据?

  3.     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(降雨量);。"它应该打印每个站点的降雨量,但它有8个,这是不正确的。我用cpu和opencl版本尝试了这个并得到了相同的结果。其他一些计算也是错误的。代码看起来应该是正确的,这是一个错误还是代码错误?

1 个答案:

答案 0 :(得分: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. &lt;&lt; (ostream操作符)为数组和dim4重载。所以做std::cout << array << std::endl;会打印到屏幕。同样可以与fstream对象一起使用。

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

  5. - Edit-- 4.降雨中出现的问题已由https://github.com/arrayfire/arrayfire/pull/531确定。我们很快就会发布新版本。

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