我最近在GTC看到了arrayfire的表演,我想我会尝试的。这是我在尝试使用它时遇到的一些问题。我正在Windows 7系统上使用AMD App SDK 2.9-1中的OpenCL运行Visual Studio 2013。
最大的挫败是我无法在调试器中查看数组对象的状态以查看其中的数据。我必须依靠af_print语句。真烦人。有什么方法可以配置调试器,让我无需打印即可查看阵列中的数据?
将数据放入数组后,如何将值作为标准数据类型取回。一个例子如下所示。我试图将元素5,0作为双精度值。示例中的行不起作用,并且我无法将其强制转换为任何标准类型。我唯一可以将其分配给另一个数组。如何取回数据?
array test = constant(0, dim4(10, 2));
test(span, 1) = 10.5;
double val = test(5, 0); //This does not compile.
Run Code Online (Sandbox Code Playgroud)
有一种简单的方法可以将阵列序列化/反序列化到磁盘吗?我没有找到执行此操作的方法,并且由于无法将值作为标准类型返回,因此我不确定如何保存它。
我正在查看您提供的降雨教程示例,但是似乎给出了错误的结果。例如,第52行的打印语句为“ af_print(rainfall);”。应该打印出每个站点的降雨量,但是其中有所有8个,这是不正确的。我在cpu和opencl版本中都尝试了此操作,并得到了相同的结果。其他一些计算也不正确。代码看起来应该是正确的,所以这是错误还是代码错误?
答案如下:
由于ArrayFire的所有数据都驻留在GPU上,因此无法在VS调试器上显示出来(没有涉及NSight或其他调试工具的更先进的技术)。另一种方法是将数据取回主机,然后在调试器中进行检查(如答案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;
Run Code Online (Sandbox Code Playgroud)<<(ostream运算符)对于数组和dim4重载。这样std::cout << array << std::endl;就可以打印到屏幕上。可以与fstream对象一起使用。
我们正在寻找降雨,并且会回来的。今天应该解决。留意我们的github页面。
-编辑-4.降雨中出现的问题已由https://github.com/arrayfire/arrayfire/pull/531修复。我们将很快发布新的版本。
编辑2:将af :: free更改为af :: freeHost以删除ArrayFire分配的主机内存。