我对GPU编程很陌生,但由于我有一个计算密集型的任务,我已经转向GPU以获得可能的性能提升.
我尝试使用ArrayFire Free版本重写我的程序.它确实比启用多线程的CPU例程更快,但达不到我预期的程度(即<100%加速),并且返回的结果不是很正确(假设与CPU例程相比误差<1%,假设CPU例程的结果是正确的).
我的任务主要是基于元素的float-32数学运算在大型矩阵(300MB-500MB大小)上,几乎没有if-thens/switch-cases等.我想性能瓶颈可能是CPU和GPU内存之间的带宽,因为它有我测试的GPU是GeForce 580GTX,带有3GB的视频内存.
如果我编写原始CUDA代码(使用CUBLAS等和平均优化)而不是使用ArrayFire来完成我的任务,是否还有一些重要的优化空间?我读了一些NVIDIA优化指南; 似乎有一些内存访问技巧可以加快数据访问速度并减少银行冲突.ArrayFire会自动使用这些常规技巧吗?
我正在测试svd,Matlab R2014a似乎没有CPUvs GPU加速.我正在使用一张GTX 460卡片和一张卡片Core 2 duo E8500.
这是我的代码:
%test SVD
n=10000;
%host
Mh= rand(n,1000);
tic
%[Uh,Sh,Vh]= svd(Mh);
svd(Mh);
toc
%device
Md = gpuArray.rand(n,1000);
tic
%[Ud,Sd,Vd]= svd(Md);
svd(Md);
toc
Run Code Online (Sandbox Code Playgroud)
此外,运行时间与运行不同,但CPU和GPU版本大致相同.为什么没有加速?
这是一些测试
for i=1:10
clear;
m= 10000;
n= 100;
%host
Mh= rand(m,n);
tic
[Uh,Sh,Vh]= svd(Mh);
toc
%device
Md = gpuArray.rand(m,n);
tic
[Ud,Sd,Vd]= svd(Md);
toc
end
>> test_gpu_svd
Elapsed time is 43.124130 seconds.
Elapsed time is 43.842277 seconds. …Run Code Online (Sandbox Code Playgroud) 我最近在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版本中都尝试了此操作,并得到了相同的结果。其他一些计算也不正确。代码看起来应该是正确的,所以这是错误还是代码错误?
我很难找到一个用来探索机器学习/人工智能的库。我有一对 R9 290x,似乎找不到适合它的库。
首先我尝试了 array-fire,它具有出色的 CPU 性能,但用于机器学习的 GPU 性能较差,如 machine_learning 示例文件夹中的基准测试所示。
我查看了 rocm 和 MIOpen,我尝试了支持臀部的 tensorflow,但发现 290x 代不支持它。我发现有人也在为 tensorflow开发llvm-amdgpu支持,但它看起来还没有准备好
我研究了 haskell 的加速,发现了一个关于amdgpu 后端的问题,但它看起来还没有准备好。
也许我搜索的范围还不够广泛?但据我所知,几乎所有东西都在 cuda 上运行,我现在买不起新 GPU。
我想在 ArrayFire 中创建虚数单位,但我不能。我可以从实数矩阵构造一个复数矩阵,但这不会是纯虚数。也许我可以用函数af_cplx2从该页面。我想到了以下几点:
af_array *R;
const af_array re = 0.0;
const af_array im = 1.0;
af_cplx2(R,re,im,0);
Run Code Online (Sandbox Code Playgroud)
但是,我在 Visual Studio 2013 中收到运行时错误(未处理的异常)。我该怎么做?先感谢您。
我试图开发的R包,它利用了Arrayfire,感谢RCPP库。我已经开始编写一个示例代码(让我们将其命名为hello_world.cpp),如下所示:
#include <arrayfire.h>
// [[Rcpp::export]]
bool test_array_fire(){
af::randu(1, 4);
return true;
}
Run Code Online (Sandbox Code Playgroud)
然后,我尝试使用sourceCpp函数编译它
Rcpp::sourceCpp('src/hello_world.cpp')
Run Code Online (Sandbox Code Playgroud)
我的第一个惊喜是我必须手动设置一些标志(在编译一段 C++ 代码时sourceCpp似乎忽略了Makevars配置)。我是这样做的:
Sys.setenv("PKG_CXXFLAGS"="-std=c++11")
Sys.setenv("PKG_CPPFLAGS"="-I/opt/arrayfire/include/")
Sys.setenv("PKG_LIBS"="-L/opt/arrayfire/lib64/ -laf")
Run Code Online (Sandbox Code Playgroud)
但是,代码仍然无法正确编译。每次试验都以以下输出结束:
Error in 'dyn.load("/tmp/RtmpHaODIU/sourceCpp-x86_64-pc-linux-gnu-1.0.2/sourcecpp_689c5adb8d/sourceCpp_14.so")':
unable to load shared object '/tmp/RtmpHaODIU/sourceCpp-x86_64-pc-linux-gnu-1.0.2/sourcecpp_689c5adb8d/sourceCpp_14.so':
libaf.so.3: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)
不幸的是,我无法为我的问题找到解决方案(即使某些 Stack Overflow 问题引发了乍一看或多或少相似的问题)。
我该如何解决?
我是 Rust(和 Arrayfire)的新手,正在从事一个小项目。我正在尝试将 Arrayfire 数组(仅真实的)转换回 Rust Vec。
经过一番研究,我无法找到解决方案。索引的 Rust Arrayfire 文档部分仅显示(据我所知)返回另一个数组的方法。
我发现这篇文章在谈论 C++ Arrayfire,但 Rust Arrayfire Array 没有实现索引特征。
有没有办法将 Arrayfire 数组转换为 Rust Vec 或一种方法来索引返回一个元素(例如一个 i64)的数组,就像 v[0] 那样?
我有一个程序依赖于多个包含文件。当我按照下面所示的顺序定义包含时,程序可以正常编译。
#include <iostream>
#include "opencv2/cvconfig.h"
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/core/internal.hpp" // For TBB wrappers
#include "arrayfire.h"
Run Code Online (Sandbox Code Playgroud)
但是,当我切换最后两个包含时,如下所示
#include <iostream>
#include "opencv2/cvconfig.h"
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "arrayfire.h"
#include "opencv2/core/internal.hpp" // For TBB wrappers
Run Code Online (Sandbox Code Playgroud)
我收到编译器错误:
1>d:\libraries\tbb41\tbb41_20130613oss\include\tbb\task.h(765): 错误 C2059: 语法错误: '{' 1>d:\libraries\tbb41\tbb41_20130613oss\include\tbb\task.h( 765): 错误 C2334: '{' 之前的意外标记;跳过明显的函数体
这是出乎意料的,我想解决它。所有包含内容均来自库(OpenCV 和 ArrayFire)。关于可能的原因以及如何解决此问题有什么建议吗?
编辑这是task.h的相关部分:
759 #if __TBB_TASK_GROUP_CONTEXT
760 //! This method is deprecated and will be removed in the future.
761 /** Use method group() instead. **/
762 task_group_context* context() {return prefix().context;} …Run Code Online (Sandbox Code Playgroud) 最近,我研究了GPU计算的用法,其中软件包的用法似乎令人困惑。
例如,CuArrays和ArrayFire似乎在做同样的事情,在这里ArrayFire似乎是在NVIDIA开发者网页上的“官”包。(https://devblogs.nvidia.com/gpu-computing-julia-programming-language)
此外,还有CUDAdrv和CUDAnative软件包...,它们似乎令人困惑,因为它们的功能似乎不像其他软件包那么简单。
这些软件包有什么作用?CuArrays和ArrayFire有什么区别吗?