CUDA库之cuRand

_梦魇花葬 2014-06-13 05:08:58
加精
cuRand函数库提供了GPU端不同类型的随机数字的生成。在C语言中,可能习惯在主机端调用标准库函数rand()。和其它的标准库函数一样,rand()无法在设备端代码使用。因此,唯一的选择是在主机端创建一组随机数字,然后将它们复制到设备端。这回导致很多问题:(1)增加主机启动时间;(2)增加PCI-E带宽;(3)实际上,数据集的随机分布并不好。
标准库函数rand()并不是设计来产生真正随机的数据。它通过创建一组伪随机数并每次简单地从列表中选择下一个元素,从而实现随机数的生成。因此,任何指导生成随机数所使用的种子的人都可以准确的预测出给定序列中的下一个随机数。
回到正题,为了使用cuRand函数库,需要包含下列头文件:

#include <curand_kernel.h>

此外,需要确保链接到了下列函数库:

curand.lib

结合上一节谈到的Thrust,我们一起来看一个例子:

#include <thrust/iterator/counting_iterator.h>
#include <thrust/functional.h>
#include <thrust/transform_reduce.h>
#include <curand_kernel.h>

#include <iostream>
#include <iomanip>

// we could vary M & N to find the perf sweet spot
struct estimate_pi :
public thrust::unary_function<unsigned int, float>
{
__device__
float operator()(unsigned int thread_id)
{
float sum = 0; unsigned int N = 10000; // samples per thread
unsigned int seed = thread_id;
curandState s;

// seed a random number generator
curand_init(seed, 0, 0, &s);

// take N samples in a quarter circle
for(unsigned int i = 0; i < N; ++i)
{
// draw a sample from the unit square
float x = curand_uniform(&s);
float y = curand_uniform(&s);

// measure distance from the origin
float dist = sqrtf(x*x + y*y);

// add 1.0f if (u0,u1) is inside the quarter circle
if(dist <= 1.0f)
sum += 1.0f;
}
// multiply by 4 to get the area of the whole circle
sum *= 4.0f;

// divide by N
return sum / N;
}
};

int main(void)
{
// use 30K independent seeds
int M = 30000;
float estimate = thrust::transform_reduce(
thrust::counting_iterator<int>(0),
thrust::counting_iterator<int>(M),
estimate_pi(),
0.0f,
thrust::plus<float>());
estimate /= M;
std::cout << std::setprecision(3);
std::cout << "pi is approximately ";
std::cout << estimate << std::endl;
return 0;
}

转自:《CUDA并行程序设计 GPU编程指南》
...全文
2772 49 打赏 收藏 转发到动态 举报
写回复
用AI写文章
49 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_16740083 2014-06-21
  • 打赏
  • 举报
回复
竹凌居士 2014-06-21
  • 打赏
  • 举报
回复
学习了,谢谢啊
chenziqifhy 2014-06-21
  • 打赏
  • 举报
回复
shen150 2014-06-21
  • 打赏
  • 举报
回复
学习了,谢谢您的分享。
李西元 2014-06-20
  • 打赏
  • 举报
回复
学习学习!!!!!!!!!!!!!
qq_16706727 2014-06-20
  • 打赏
  • 举报
回复
学习了 谢谢.
robin58 2014-06-20
  • 打赏
  • 举报
回复
刚刚看到,了解一点了
qq_16609681 2014-06-17
  • 打赏
  • 举报
回复
真是好是不是
「已注销」 2014-06-17
  • 打赏
  • 举报
回复
CUDA?好吧,来学习了
qq_16632601 2014-06-17
  • 打赏
  • 举报
回复
好难啊 看不懂呢
qq_16606779 2014-06-17
  • 打赏
  • 举报
回复
学习了,谢谢您的分享。
henry81918 2014-06-16
  • 打赏
  • 举报
回复
学习了~~很好
春枫琰玉 2014-06-16
  • 打赏
  • 举报
回复
学习了。。。很好
qq_14918461 2014-06-16
  • 打赏
  • 举报
回复
学习了 学习了
orangeeku 2014-06-16
  • 打赏
  • 举报
回复
一样是来学习的
adiaoajin 2014-06-16
  • 打赏
  • 举报
回复
好复杂啊要学习
alexzhb 2014-06-16
  • 打赏
  • 举报
回复
看来我要好好学习了
sinat_16595929 2014-06-16
  • 打赏
  • 举报
回复
学习学习再学习
sinat_16595929 2014-06-16
  • 打赏
  • 举报
回复
高深的学问,表示不懂
tabctrl1 2014-06-16
  • 打赏
  • 举报
回复
一如既往的支持
加载更多回复(29)

579

社区成员

发帖
与我相关
我的任务
社区描述
CUDA™是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。 它包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎。
社区管理员
  • CUDA编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧