如何通过 CUDA 在 Julia 中将 For 循环带到 GPU 上

问题描述 投票:0回答:1

我刚开始了解如何使用 GPU 进行编码。 我见过带有 Nvidia GPU 的 CUDA。 我在CPU上的代码是用BlackBoxOptim.jl的优化方法如下:

px_values = collect(-4.5/ang:0.25/ang:4.5/ang)
py_values = collect(-4.5/ang:0.25/ang:4.5/ang)

min_energy_values = zeros(length(px_values),length(py_values))

for i in axes(px_values,1)
    Threads.@threads for j in axes(py_values,1)
                        px=px_values[i]
                        py=px_values[i]

                        f1 = (y) -> Hexpecvalue(px,py,y)./NormalWF(y)

                        result =bboptimize(f1,[1,0,5.0]; SearchRange=[(0,10),(1,10)],MaxFuncEvals=1250)

                        min_energy_values=best_fitness(result)
                    end
end 

结束

但我现在希望能够通过 GPU 实现这一点。

我看到首先我们必须介绍 CUArryays,即:

px_values = CUDA.CuArray(collect(-4.5/ang:0.25/ang:4.5/ang))
py_values = CUDA.CuArray(collect(-4.5/ang:0.25/ang:4.5/ang))
min_energy_values = CUDA.zeros(length(px_values), length(py_values)).

但是,我不确定如何开始完全设置 CUDA 以使我能够做到这一点。

cuda julia gpu
1个回答
0
投票

对此有不同的选择,您可能值得研究一下有关 GPU 编程的更一般的介绍(不仅仅是 Julia)。一般来说,在 GPU 上,您希望避免数组的标量索引,因此常规 for 循环通常不合适。

  • 尝试以可以直接以矩阵形式或使用
    map
    解决的方式来表述你的问题,并且不再需要
    for
    循环。
  • 查看提供允许更复杂张量操作的宏的库,Tullio.jl 和 TensorOperations.jl 均与 GPU 兼容,您可以使用它们将相当复杂的操作转换为可在 CPU 和 GPU 上运行的一行命令,他们为你定义 GPU 内核
  • 使用 KernelAbstractions.jl 或 CUDA.jl 编写自己的内核

这只是一个非常简短的概述。尝试将您的问题表述为“最小的、可重现的”示例(参见此处),您更有可能获得一些更具体的帮助。它确实就像您在每个元素的 for 循环中执行某种优化。如果没有 MWE 或更多上下文,就很难判断这是否真的可以轻松高效地在 GPU 上运行。

    

© www.soinside.com 2019 - 2024. All rights reserved.