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

时间:2012-04-10 01:53:23

标签: multithreading language-agnostic parallel-processing gpu gpgpu

我目前有一个类似于此的并行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来帮助并行处理任务。我已经读过这样令人难以置信的并行任务可以非常有效地利用现代GPU。

使用任何语言,像这样使用GPU进行简单并行循环的最简单方法是什么?

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

3 个答案:

答案 0 :(得分:2)

正如Li-aung Yip在评论中所说,使用GPU的最简单方法是使用支持数组操作的Matlab,并自动(或多或少)将这些移动到GPU。但要实现这一点,您需要将代码重写为基于矩阵的纯操作。

否则,大多数GPU使用仍然需要在CUDA或OpenCL中编码(您需要将OpenCL与AMD卡一起使用)。即使你使用你喜欢的语言的包装器,在GPU上运行的实际代码仍然通常用OpenCL编写(它看起来像C一样模糊)。所以这需要相当多的学习/努力。你可以先从AMD下载OpenCL并阅读文档......

我怀疑这些选项都需要学习新的想法。我认为,你真正想要的是一个高级别,但仍然是传统外观,针对gpu的语言。不幸的是,它们似乎并不存在太多。我能想到的唯一例子是theano - 你可能会尝试。即使在那里,你仍然需要学习python / numpy,我不确定theano实现是多么坚固,但它可能是最不痛苦的前进方式(因为它允许“传统”方法 - 使用矩阵在很多方面更容易,但有些人似乎发现很难掌握,从概念上讲。)

ps我不清楚gpu会帮助你解决问题,顺便说一句。

答案 1 :(得分:1)

您可能想查看阵列火灾。

http://www.accelereyes.com/products/arrayfire

如果您使用openCL,则需要为不同的设备供应商,intel,AMD和Nvidia下载单独的实施。

答案 2 :(得分:0)

您可能希望查看通过指令启用并行性的OpenACC。您可以将代码(C / C ++ / Fortran)移植到异构系统,同时保持在同类系统上仍然运行良好的源代码。请看一下这篇介绍video。 OpenACC不是GPU编程,而是在代码中表达并行性,这可能有助于在不使用CUDA或OpenCL等低级语言的情况下实现性能提升。 OpenACC可用于PGI,Cray和CAPS的商业编译器(PGI为新用户提供30天免费试用)。