大家好,我是一个纯新手,在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