Numba CUDA加速似乎很慢

问题描述

在这里以Numba / cuda开头的新手。 我写了这个小测试脚本来比较@jit和@ cuda.jit。速度,只是为了感受一下。它为256个单独的实例计算逻辑方程的10M步。 CUDA部分大约需要1.2秒才能完成。 cpu的“连接”部分在5s内完成(仅在cpu上使用了一个线程)。 因此,从转到GPU(专用的GTX1080TI不做其他任何事情)的速度提高了大约4倍。我希望cuda部分(并行执行所有256个实例)会更快。我在做什么错了?

这是工作示例:

#!/usr/bin/python3
#logistic equation on gpu/cpu comparison

import os,sys
#Set environment variables (needed for numba 0.42 to find lvvm)
os.environ['NUMBAPRO_NVVM'] = '/usr/lib/x86_64-linux-gnu/libnvvm.so'
os.environ['NUMBAPRO_LIBDEVICE'] = '/usr/lib/nvidia-cuda-toolkit/libdevice/'

from time import time
from scipy import *
from numba import cuda,jit
from numba import int64,int32,float64

@cuda.jit
def logistic_cuda(array_in,array_out):
    pos = cuda.grid(1)
    x = array_in[pos]
    for k in range(10*1000*1000):
        x = 3.9 * x * (1 - x)
    array_out[pos] = x

@jit
def logistic_cpu(array_in,array_out):
    for pos,x in enumerate(array_in):
        for k in range(10*1000*1000):
            x = 3.9 * x * (1 - x)
        array_out[pos] = x

if __name__ == '__main__':
    N=256
    in_ary = random.uniform(low=0.2,high=0.9,size=N).astype('float32')
    out_ary = zeros(N,dtype='float32')
    
    t0 = time()
    #explicit copying. not really needed
    d_in_ary = cuda.to_device(in_ary) 
    d_out_ary = cuda.to_device(out_ary)
    t1 = time()
    
    logistic_cuda[1,N](d_in_ary,d_out_ary)
    cuda.synchronize()
    t2 = time()
    out_ary = d_out_ary.copy_to_host()
    t3 = time()
    
    print(out_ary)
    print('Total time cuda: %g seconds.'%(t3-t0))
    
    out_ary2 = zeros(N)
    t4 = time()
    logistic_cpu(in_ary,out_ary2)
    t5 = time()
    print('Total time cpu: %g seconds.'%(t5-t4))
    
    print('\nDifference:')
    print(out_ary2-out_ary)
    
#Total time cuda: 1.19364 seconds.
#Total time cpu: 5.01788 seconds.

谢谢!

解决方法

问题可能是由于少量数据循环依赖性引起的。实际上,由于拥有大量的CUDA内核,现代Nvidia GPU可以同时执行数千个CUDA线程(以32个线程的形式打包)。在您的情况下,每个线程都使用顺序循环对array_out的一个单元执行计算。但是,只有256个单元。因此,最多可以同时运行256个线程(8个线程段)-GPU应该能够管理的并发线程数只是很小的一部分。因此,如果要提高速度,您需要为GPU提供更多的并行性(例如,通过增加数据大小或同时计算多元回归)。 >