首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python使用pycuda在GPU上并行处理批量判断素数

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

作者头像
Python小屋屋主
发布2018-04-16 15:20:46
1.9K0
发布2018-04-16 15:20:46
举报
文章被收录于专栏:Python小屋Python小屋

借助于扩展库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倍左右。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-12-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python小屋 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
GPU 云服务器
GPU 云服务器(Cloud GPU Service,GPU)是提供 GPU 算力的弹性计算服务,具有超强的并行计算能力,作为 IaaS 层的尖兵利器,服务于深度学习训练、科学计算、图形图像处理、视频编解码等场景。腾讯云随时提供触手可得的算力,有效缓解您的计算压力,提升业务效率与竞争力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档