抱歉标题含糊。
我编写了一个内核来模拟 3D 热传递。我遇到的问题是在 8 核 Dell Studio XPS 上并行运行的程序版本超过了我的 GTS-240 GPU。我尝试了很多方法来让它运行得更快,但我得出的结论是,只是计算本身太大了。计算大约有 35 个 FLOP,我只是为模拟中的每个单元启动一个线程。尽管如此,我在 GPU 上只能获得大约 3340 万个单元/秒,而在 CPU 上只能获得 4040 万个/秒。据我了解,GPU 擅长于这样的任务,每个时间步有 170 万个单元,每个单元都需要对它们进行计算。
每次计算我也有 28 个数组访问,都在普通的 GPU 内存中。
这是计算。我不会发布真实的东西——这不是最高机密,只是没有必要。以“f”为前缀的变量是浮点数,“i”表示整数。
f_celldata[iA] =(-f_constA[iA-iB] * (f_mutA[iA] - f_mutA[iA-iB]) / f_constB[iA-1] +
f_constA[iA] * (f_mutA[iA+iB] - f_mutA[iA]) / f_constB[iA]) * (1.0 / f_constB[iA]) +
(-f_constA[iA-iC] * (f_mutA[iA] - f_mutA[iA-iC]) / f_constB[iA-1] +
f_mutA[iA] * (f_constA[iA+*iC] - kern_T_mat[linOffset]) / kern_dy_e[y]) * (1.0 /kern_dy_c[y]) +
(-f_constA[iA-1] * (f_mutA[iA] - f_mutA[iA-1]) / f_constB[iA-1] +
f_constA[iA] * (f_mutA[iA+1] - f_mutA[iA]) / f_constB[iA]) * (1.0 / f_constB[iA]);
显然,当我在这里写下这篇文章时,我有点草率。实际上,计算尽可能简单,还有更多变量,在这里,为了简单起见,我做了同样的计算。
我希望在 GPU 编程方面比我更有经验的人能给我一些建议。计算量是否太大而无法使用 GPU 进行?单独的单个计算(数组访问和 FLOP 一起)每个时间步需要 35 毫秒。这或多或少是典型的吗?我真的不明白我怎样才能让它更快。特斯拉的工作会更快吗?大约快多少?
谢谢你。