Python使用pycuda在GPU上并行处理批量判断素数

借助于扩展库pycuda,可以在Python中访问NVIDIA显卡提供的CUDA并行计算API,使用非常方便。安装pycuda时要求已正确安装合适版本的CUDA和Visual Studio(注意,并不是版本越新越合适,目前2015暂时还不行,最好使用VS2013),然后再使用pip安装pycuda。

下面的代码用来统计100000000之内的所有素数个数。

import time

import pycuda.autoinit

import pycuda.driver as drv

import numpy as np

from pycuda.compiler import SourceModule

#编译C代码进入显卡,并行判断素数

mod = SourceModule('''

__global__ void isPrime(int *dest, int *a, int *b)

{

    const int i = threadIdx.x+blockDim.x*blockIdx.x;

    int j;

    for(j=2;j<b[i];j++)

    {

        if(a[i]%j == 0)

        {

            break;

        }

    }

    if(j >= b[i])

    {

        dest[i] = a[i];

    }

}

''')

#定义待测数值范围,和每次处理的数字数量

end = 100000000

size = 1000

#获取函数

isPrime = mod.get_function("isPrime")

result = 0

start = time.time()

#分段处理,每次处理1000个数字

for i in range(end//size):

    startN = i * size

    a = np.array(range(startN, startN+size)).astype(np.int64)

    b = np.array(list(map(lambda x: int(x**0.5)+1, a))).astype(np.int64)

    dest = np.zeros_like(a)

    isPrime(drv.Out(dest), drv.In(a), drv.In(b),

            block=(size,1,1), grid=(2,1))

    result += len(set(filter(None, dest)))

print(time.time()-start)

#上面的代码中把1也算上了,这里减去

print(result-1)

测试结果:在4核CPU、640核GPU的笔记本上运行,本文代码为在CPU上运行的类似代码运行速度的8倍左右。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dongfuguo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值