使用GPU并行for循环的最简单方法。

6

我目前有一个类似这样的并行for循环:

int testValues[16]={5,2,2,10,4,4,2,100,5,2,4,3,29,4,1,52};
parallel_for (1, 100, 1, [&](int i){ 
    int var4;
    int values[16]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
    /* ...nested for loops */
        for (var4=0; var4<16; var4++) {
            if (values[var4] != testValues[var4]) break;
        }
    /* ...end nested loops */
}

我已经尽力优化到了极限,唯一能做的就是增加更多资源。

我想利用GPU并行处理任务。我读过类似这样的 embarrassingly parallel 任务可以很有效地利用现代GPU。

使用任何语言,如何最简单地将GPU用于类似这样的简单并行for循环?

我对GPU架构或本地GPU代码一无所知。


如果你的任务是某种数值计算任务,或者如果你可以将其重新构造为基于矩阵数学的问题,那么你可以使用MATLAB。新的MATLAB支持Parallel Computing Toolbox中的parallel-for(parfor)和Nvidia CUDA GPU上的矩阵数学。这两个都相对容易,只需要对现有的MATLAB代码进行适度的更改即可。 - Li-aung Yip
在这里提供一些关于你实际要做的更多信息可能会有帮助。请记住,从CPU传输数据到GPU会产生很大的开销,因此只有在每单位输入数据进行大量计算工作时,GPU计算才能提高性能。在向量中计算每个数字的平方并不是一个好的GPGPU使用方式(每单位数据几乎没有任何工作量);而计算向量的FFT是一个很好的使用方式(对少量数据进行大量工作)。 - Li-aung Yip
我有几个嵌套的for循环,在最内层的循环中,我使用循环索引计算16个值,并将它们与testValues []数组进行比较。不应该有任何重要的内存访问。此外,我正在使用AMD / ATI卡(6850)。 - Flash
3个回答

2
正如Li-aung Yip在评论中所说,使用GPU的最简单方法是使用支持数组操作并自动(或多或少)将其移动到GPU的类似Matlab的工具。但是,为了使其起作用,您需要将代码重写为纯矩阵操作。
否则,大多数GPU使用仍然需要使用CUDA或OpenCL进行编码(如果您使用AMD卡,则需要使用OpenCL)。即使您使用喜欢的语言的封装器,实际在GPU上运行的代码通常仍然是用OpenCL编写的(它看起来有点像C语言)。因此,这需要相当多的学习和努力。您可以从AMD下载OpenCL并阅读文档开始...
这两个选项都需要学习新的思想,我怀疑。我认为你真正想要的是一个高级但看起来仍然传统的语言,针对GPU。不幸的是,它们似乎还没有多少存在。我能想到的唯一一个例子是 theano - 你可以试试那个。即使在那里,你仍然需要学习Python / numpy,我不确定Theano实现有多可靠,但它可能是最少痛苦的前进方式(因为它允许“传统”方法 - 使用矩阵在很多方面更容易,但有些人似乎在概念上很难理解)。顺便说一下,我不清楚GPU是否会对您的问题有所帮助。

我决定使用OpenCL - 其学习曲线实际上不太陡峭。 我发现它比苦苦挣扎于试图转换现有代码的库要容易一些 - 我能找到的少数包装器很快就失败了,并且仍需要GPU编程技巧。不幸的是,目前Matlab似乎仅支持CUDA。 - Flash
好的,很酷。你是在用C语言打电话吗?我发现PyOpenCL比C语言更容易 - 你仍然以相同的方式编写OpenCL部分,但准备要发送的数据的工作量较小。但是我更习惯使用Python而不是C语言... - andrew cooke

1

0

你可能想要了解一下OpenACC,它可以通过指令实现并行化。你可以将你的代码(C/C++/Fortran)移植到异构系统上,同时保持源代码在同构系统上的良好运行。看一下这个介绍视频。OpenACC不是GPU编程,而是将并行性表达到你的代码中,这可能有助于在不需要太多低级语言知识(如CUDA或OpenCL)的情况下实现性能提升。OpenACC可在PGI、Cray和CAPS的商业编译器中使用(PGI为新用户提供免费30天试用期)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接