用CUDA进行复合函数运算时速度奇慢

问题概况

配置: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

全局变量的会影响性能,先把全局变量消掉再做benchmark会更准确