2015年12月

VS2013+CUDA7.5配置


  想要研究GPU编程,很多人都在配置上卡住了,所以我把我的配置过程分享出来,希望能给大家提供参考。

电脑配置:     系统:WIN10 64位     开发平台:VS 2013     显卡:英伟达 GeForce GT 740M     CUDA版本:7.5

1.安装最新版CUDA    CUDA官方下载地址    默认安装在C盘

2.配置环境变量        CUDA_SDK_PATH = C:\ProgramData\NVIDIA Corporation\CUDA Samples\v7.5 CUDA_LIB_PATH = %CUDA_PATH%\lib\x64  CUDA_BIN_PATH = %CUDA_PATH%\bin   CUDA_SDK_BIN_PATH = %CUDA_SDK_PATH%\bin\x64   CUDA_SDK_LIB_PATH = %CUDA_SDK_PATH%\common\lib\x64     然后,在系统变量 PATH 的末尾添加:

;%CUDA_LIB_PATH%;%CUDA_BIN_PATH%;%CUDA_SDK_LIB_PATH%;%CUDA_SDK_BIN_PATH%;


Python GPU编程之NumbaPro入门


  相信如果你使用过Python Numpy包,一定了解NumPy(Numeric Python)提供了许多高级的数值编程工具,如:矩阵数据类型、矢量处理,以及精密的运算库。它专为进行严格的数字处理而产生。多为很多大型金融公司使用,以及核心的科学计算组织如:Lawrence Livermore,NASA用其处理一些本来使用C++,Fortran或Matlab等所做的任务。   但是由于复杂的计算,Numpy的计算效率难免受到影响,因此我们对它进行了许多优化,用于优化的包有PyPy、Numba 与 Cython,而NumbaPro就是建立在Numba和cuda基础上的高级优化方法。   下面我们一起来看。   使用NumbaPro,我们可以对Numpy中的方法进行优化,使Python代码可以动态编译为机器码,并在运行中加载,使得GPU充分发挥多线程的优势。针对GPU,Numbapro也可以自动完成工作,并优化GPU体系结构的代码。另外,基于CUDA API编写的Python代码也可以有效地利用硬件。   说了这么多,下面就让我们从简单的示例开始学习。

 from numbapro import vectorize
@vectorize(['float32(float32, float32)'], target='cpu')
def sum(a, b):
    return a + b

  如果需要使用GPU来运行,只需要将第二行改成@vectorize(['float32(float32, float32)'], target='gpu')


插件发布:tyepcho编辑器左右编辑


起步

最近深深的迷上了Markdown,无论是编写代码说明文档还是记日记写博客,没有markdown来排版感觉浑身难受。也是因为wordpress对markdown的不友好,选择了typecho作为我的博客系统,自带的编辑器只有撰写的浏览两种,要看效果还要切换,没有像sengmentfault那样有三种编辑模式,还是实时看到渲染效果。


Python GPU编程之加速篇


在上一篇中我们对Python GPU编程进行了入门讲解,这里我们将继续探究它的应用。 我们以FFT (离散傅氏变换的快速算法)为例,看看究竟如何利用GPU进行加速。 先看示例代码,然后进行讲解。

import sys
import numpy as np
from scipy.signal import fftconvolve
from scipy import misc, ndimage
from matplotlib import pyplot as plt
from numbapro.cudalib import cufft
from numbapro import cuda, vectorize
from timeit import default_timer as timer

@vectorize(['complex64(complex64, complex64)'], target='gpu')
#目标平台是64位机器且拥有GPU
def vmult(a, b):
    return a * b

def best_grid_size(size, tpb):
    bpg = np.ceil(np.array(size, dtype=np.float) / tpb).astype(np.int).tolist()
    return tuple(bpg)

def main():
    # 构建过滤器
    laplacian_pts = '''
    -4 -1 0 -1 -4
    -1 2 3 2 -1
    0 3 4 3 0
    -1 2 3 2 -1
    -4 -1 0 -1 -4
    '''.split()

    laplacian = np.array(laplacian_pts, dtype=np.float32).reshape(5, 5)

    # 构建图像
    try:
        filename = sys.argv[1]
        image = ndimage.imread(filename, flatten=True).astype(np.float32)
    except IndexError:
        image = misc.lena().astype(np.float32)

    print("Image size: %s" % (image.shape,))

    response = np.zeros_like(image)
    response[:5, :5] = laplacian

    # CPU
    ts = timer()
    cvimage_cpu = fftconvolve(image, laplacian, mode='same')
    te = timer()
    print('CPU: %.2fs' % (te - ts))

    # GPU
    threadperblock = 32, 8
    blockpergrid = best_grid_size(tuple(reversed(image.shape)), threadperblock)
    print('kernel config: %s x %s' % (blockpergrid, threadperblock))

    # cuFFT系统,触发器初始化.
    # 对于小数据集来说,效果更明显.
    # 不应该计算这里浪费的时间
    cufft.FFTPlan(shape=image.shape, itype=np.complex64, otype=np.complex64)

    # 开始GPU运行计时
    ts = timer()
    image_complex = image.astype(np.complex64)
    response_complex = response.astype(np.complex64)

    d_image_complex = cuda.to_device(image_complex)
    d_response_complex = cuda.to_device(response_complex)

    cufft.fft_inplace(d_image_complex)
    cufft.fft_inplace(d_response_complex)

    vmult(d_image_complex, d_response_complex, out=d_image_complex)

    cufft.ifft_inplace(d_image_complex)

    cvimage_gpu = d_image_complex.copy_to_host().real / np.prod(image.shape)

    te = timer()
    print('GPU: %.2fs' % (te - ts))

    # 绘制结果
    plt.subplot(1, 2, 1)
    plt.title('CPU')
    plt.imshow(cvimage_cpu, cmap=plt.cm.gray)
    plt.axis('off')

    plt.subplot(1, 2, 2)
    plt.title('GPU')
    plt.imshow(cvimage_gpu, cmap=plt.cm.gray)
    plt.axis('off')

    plt.show()

if __name__ == '__main__':
    main()

看看运行结果:

1.png

时间对比:

Image size: (512L, 512L)
CPU: 0.66s
kernel config: (16, 64) x (32, 8)
GPU: 0.09s
[Finished in 61.4s]

1.导入的包

  • Numpy提供常见的数学函数,包含许多有用的数学库
  • Scipy是python下的数值计算库,和Numpy一样是科学计算不可或缺的库
  • Matplotlib是用以绘制二维图形的Python模块
  • Numbapro是CUDA提供的专用库
  • timeit是计时工具

2.首先程序提供了一个测试数据集并进行转化,对于CPU部分,直接调用Scipy中的fftconvolve函数计算出结果,而GPU则主要调用了numbapro中cufft库,具体使用参考官方文档。

3.计算出结果后绘图展示,主要使用matplotlib的方法,只需设置plt对象并传入参数即可。

以上在代码中有详细注释,不一样展开。总的来说,使用GPU还是得参考官方的文档,并结合Python编程,才能解决复杂的问题并达到良好的效果。