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 来帮助并行处理任务。我读过这样的令人尴尬的并行任务可以非常有效地利用现代 GPU。

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

我对 GPU 架构或原生 GPU 代码一无所知。

4

3 回答 3

2

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

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

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

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

于 2012-04-10T12:28:36.503 回答
1

您可能想检查阵列火灾。

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

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

于 2012-04-23T21:24:51.467 回答
0

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

于 2015-07-02T15:04:30.990 回答