Numba(??)

Numba for CUDA GPUs

一、概况

Numba能够将部分python代码编进CUDA内核里面。Numpy数组能够在CPU和GPU之间自动传输。

术语:

host: CPU

device: GPU

host memory: 系统主memory

device memory: GPU板卡上的memory

kernels: 一个GPU函数launched by the host,能够在device上执行

device function: 一个GPU函数在device上执行,只能被device调用

注意:

Numba没有实现所有的CUDA功能,下面的功能是没有实现的:

dynamic parallelism

texture memory

二、编写CUDA内核

内核declaration(声明):

内核函数是CPU能够调用的GPU函数,它有两个基本的特性:

1、内核函数无法显式的返回值,所有结果数据必须写入传递给函数的数组(array)

2、调用内核函数时,显式声明线程结构

咋一看,用Numba写一个CUDA内核很像是写一个CPU的JIT 函数。

@cuda.jit
def increment_by_one(an_array):
    """
    Increment all array elements by one.
    """
    # code elided here; read further for different implementations

内核调用:

 内核通常用下面的方式调用:

threadsperblock = 32
blockspergrid = (an_array.size + (threadsperblock - 1)) // threadsperblock
increment_by_one[blockspergrid, threadsperblock](an_array)

注意有两步:

1、实例化内核:确定blocks per grid和a number of threads per block。两者的乘积就是整个的threads数目。

2、运行内核,传入input array。

上面,选择block size(number of threads per block)是非常关键的。

1、在软件端,the block size决定了多少个threads共享给定的shared memory区域。

2、在硬件端,the block size需要足够大才能充分利用execution units。

posted @ 2019-05-22 20:03  阿刚的代码进阶之旅  阅读(540)  评论(0编辑  收藏  举报