问题概况
配置:i3 9100F,GTX1660S,GPU版本第一次运行会有额外的10秒钟用于加载环境
以显存允许的最大数据量(数组长度=10000000)进行单纯四则运算时,GPU速度大约提高250倍。
然而,进行复合函数运算时,CPU计算速度反而快30倍
详情 & MWE
using CuArrays: CuArray
using GPUArrays
allowscalar(false)
using Random
# i3 9100F_GTX1660S_GPU版本第一次运行会有额外的10秒钟用于加载环境
# 单纯四则运算,显存允许的最大数据量,GPU速度大约提高250倍
数组长度=10000000
function 算法(参数)
return (参数 + 2)*3
end
for Typ in (CuArray, Array)
global x = Typ(rand(数组长度));
global y = Typ(zeros(数组长度));
@time y .= GPUArrays.map(算法, x);
end
# GPU 0.000165 seconds
# CPU 0.039865 seconds
# 复合函数令CPU计算速度反而快30倍
function 函数1(参数)
return GPUArrays.rand(1:数组长度,参数)
end
function 函数2(参数)
return GPUArrays.sum(x[参数] .* y[参数])
end
function 函数3(参数)
return 函数2(函数1(参数))
end
for Typ in (CuArray, Array)
global x = Typ(rand(数组长度));
global y = Typ(rand(数组长度));
global z = Typ(zeros(数组长度));
@time z = Typ(GPUArrays.map(函数3, 100:200));
end
# GPU 0.023737 seconds
# CPU 0.000774 seconds
# 换一种函数定义方式,GPU速度又变慢了一倍,CPU速度减慢不明显
for Typ in (CuArray, Array)
内部函数1 = 内部参数1 -> GPUArrays.rand(1:数组长度,内部参数1)
内部函数2 = 内部参数2 -> GPUArrays.sum(x[内部参数2] .* y[内部参数2])
内部函数3 = 内部参数3 -> 内部函数2(内部函数1(内部参数3))
@time global z = Typ(GPUArrays.map(内部函数3, 100:200));
end
# GPU 0.045553 seconds
# CPU 0.000985 seconds
# 一维数组z相邻100项求和也许显存便于分配的思路反而更慢了30000倍,
# 注意第二步计算总量应该是减小了100倍以上,用时反而更多了300倍。
步长=100
function 算法1(参数)
return x[参数] .* y[参数]
end
function 算法2(参数)
return GPUArrays.sum(z[参数:(参数+步长-1)])
end
for Typ in (CuArray, Array)
global w = Typ(zeros(length(1:步长:(数组长度-步长+1)))); # w长度只有 数组长度/步长
@time global z = Typ(算法1(1:数组长度));
@time global w = Typ(GPUArrays.map(算法2, 1:步长:(数组长度-步长+1))); # GPU用时13秒
end
# GPU步骤1 0.080022 seconds
# GPU步骤2 13.108985 seconds
# CPU步骤1 0.130849 seconds
# CPU步骤2 0.063022 seconds