CUDA入门的一些问题

大家好,我是一个纯新手,在Julia和CUDA方面都不是很熟悉。最近在运行网上的一个简单例子时出现了一个很奇怪的问题。先贴代码

using CUDAdrv
using CuArrays: CuArray
using GPUArrays
println(CUDAdrv.name(CuDevice(0)))

for Typ in (CuArray, Array)
    x = Typ(ones(Float32, 5000000))
    y = Typ(zeros(Float32, 5000000))
    t = @elapsed begin
        for i in 0:100
            for j in 0:100
                y .= x .* 3.2
                GPUArrays.synchronize(y)
            end
        end
    end
    if y isa CuArray
        println("GPU time: ", t)
    else
        println("CPU time: ", t)
    end
end

这个代码是一个比较GPU和CPU运行速度的代码,我第一与行的时候,出现了这样的问题

WARNING: both CUDAdrv and Base export "@elapsed"; uses of it in module Main must be qualified
ERROR: LoadError: LoadError: UndefVarError: @elapsed not defined
in expression starting at C:\Users\Administrator\Desktop\GPU计算入门.jl:9
in expression starting at C:\Users\Administrator\Desktop\GPU计算入门.jl:6

因为不了解@elapsed这个宏,所以我查了下文档,运行了文档给出的示例,结果报错。

julia> @elapsed sleep(0.3)
ERROR: LoadError: UndefVarError: @elapsed not defined in expression starting at none:1

然后我重启了ATOM,首先运行@elapsed在示例文档中的示例,结果成功了。

julia>  @elapsed sleep(0.3)
0.31811027

随后再次运行代码,结果也成功了。

WARNING: using CUDAdrv.@elapsed in module Main conflicts with an existing identifier.
GeForce GT 730
GPU time: 27.781697117
CPU time: 58.117572707

有几个问题想麻烦给位大佬能帮忙解答下:
1、造成这种现象的原因是什么?
2、代码中的 using GPUArrays 是我自己后加的,原帖没有。但是我不加运行会报错,这是原贴的疏忽,还是说其他原因?到底该不该加?(来自零基础小白的内心呐喊)

WARNING: using CUDAdrv.@elapsed in module Main conflicts with an existing identifier.
GeForce GT 730
ERROR: LoadError: UndefVarError: GPUArrays not defined
Stacktrace:
 [1] macro expansion at C:\Users\Administrator\Desktop\GPU计算入门.jl:12 [inlined]
 [2] macro expansion at .\util.jl:213 [inlined]
 [3] top-level scope at C:\Users\Administrator\Desktop\GPU计算入门.jl:8
in expression starting at C:\Users\Administrator\Desktop\GPU计算入门.jl:5

3、代码中GPUArrays.synchronize(y)到底是什么意思?原贴说“类似这样的代码在并行计算中很常见,目的是等待所有 GPU 核完成计算达到同步的效果。”但我搜索了中文文档以及GPUArrays.jl CUDA.jl和CuArrys.jl的文档,并没有找到synchronize()的用法。
4、最后还请各位大佬给一点用Julia编写CUDA的学习建议,万分感谢。

最后附上代码原帖的地址https://www.jianshu.com/p/7c3b1e1c3cbb

  1. CUDAdrv和Base里面都定义了@elapsed 宏,但是两个宏的参数并不一样,这里用的是Base里面的。当你using CUDAdrv以后,需要明确指定是用的哪一个@elpased,这里你改成Base.@elapsed就好了。
  2. 用到了GPUArrays里面的函数你就得加,比如这个synchronize
  3. synchronize(y)就是等待所有y的操作结束。因为代码在GPU上运行,和CPU端是异步的,这句话会阻塞CPU,让其等待GPU端运行结束再进行下一步循环。
  4. 建议先看看CUDA相关的资料,然后再用julia写CUDA,你就不会有这些问题了。这些问题都是因为你对CUDA和julia本身不熟悉导致的。

感谢您的解答,谢谢

别删问题啊。。留给以后有同样问题的人参考不好吗 :expressionless: