GPU上使用随机数的问题

bigmanvip 2009-05-12 11:14:53
加精
请问如何用一个高效的方法在kernel里使用随机数?
我目前用的方法是先在内存里生成一个连续随机数数组空间,然后再用内存拷贝,复制到Global memory里去,这样做的效率很低。
像这样:
const int Ant_Num = 30;
const int rand_Size = Ant_Num * sizeof(float);
float* P_rand = (float*)malloc( rand_Size);
float* d_rand;
cudaMalloc( (void**)&d_rand, rand_Size);
for ( k = 0; k <= Ant_Num - 1; k++)
{
int jrand = rand() % 3000;
P_rand[k] = float( jrand) / 3001;
}
cudaMemcpy( d_rand, P_rand, rand_Size, cudaMemcpyHostToDevice);
...全文
1233 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
kukukiller 2010-12-08
  • 打赏
  • 举报
回复
我也好奇12楼的方法,楼主能贴出源代码,让我们参考一下吗?
chenbo888666999 2009-10-18
  • 打赏
  • 举报
回复
请问12楼的朋友,我按你说的实现了一个随机数生成函数,但是效果没你做得好,可否把你的实现代码贴出来,让我看看,谢谢!
microsx 2009-10-15
  • 打赏
  • 举报
回复
随机算法用GPU实现?特别的想法,学一下
bigmanvip 2009-05-22
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 lichunli8866 的回复:]
在device里定一个随机函数rand(),直接可由device调用它
[/Quote]
这种方法效率会比较低不如就直接写在kernel函数里面
lichunli8866 2009-05-18
  • 打赏
  • 举报
回复
在device里定一个随机函数rand(),直接可由device调用它
weiyingsong0221 2009-05-18
  • 打赏
  • 举报
回复
基尔加
weiyingsong0221 2009-05-18
  • 打赏
  • 举报
回复
挺好的啊
bigmanvip 2009-05-17
  • 打赏
  • 举报
回复
我是通过实验得出结果的,实际上我这个程序是用来做蚁群算法加速的,只有当随机性够好时才能保证结果收敛到趋近最佳解的,我用这个随机数算法得到的解,比用系统自带的rand函数得到的解还要好一点,所以就此判断这个随机数算法是足够好的。谢谢你的指教,我发的每篇帖子都得到了你的耐心回帖,并从中受到启发,很感谢你!
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 bigmanvip 的回复:]
....,这样子就保证了我的种子既有随机性,...
[/Quote]
'
这句话不是那么好下结论的.不是看上去"够乱"就有随机性的.要有数据证明或至少是一个"够多"数据的统计结果.呵呵.
bigmanvip 2009-05-15
  • 打赏
  • 举报
回复
问题终于解决了,采用了简单随机数生成算法,详细介绍的网址是http://www.cnblogs.com/asashina/archive/2008/02/11/1067067.html,经过试验效果很好,首先是随机性很好,然后是效率很高,开销很小。
原理如下面的源码所示,它采用了三种随机算法混合而成,“线性同余”,“移位轮转”和“带记忆乘法”,我在实际使用时把种子的生成方法改了一下,改为每个kernel的线程号,和在block内的序号,再加上在循环开始时就已经生成好的一个随机数,和一个大数,这样子就保证了我的种子既有随机性,又保证了不同的kernel内的种子的产生方法是不同的,这样在进行随机数运算就可以保证产生的数随机性够好,并且开销很小
unsigned int x = 123456789,
y = 362436000,
z = 521288629,
c = 7654321; /* Seed variables */

unsigned int KISS()
{
unsigned long long t, A = 698769069ULL;

x = 69069*x+12345;

y ^= (y<<13); y ^= (y>>17); y ^= (y<<5);

t = (A*z + c);
c = (t >> 32);
z = t;

return x+y+z;
}
terrywolf 2009-05-14
  • 打赏
  • 举报
回复
谢谢分享!
SHENGARLAND 2009-05-13
  • 打赏
  • 举报
回复
同问
qin_kun 2009-05-13
  • 打赏
  • 举报
回复
没有人回答?
jurenwangzi8 2009-05-13
  • 打赏
  • 举报
回复
谢谢分享!
yangzai0616 2009-05-13
  • 打赏
  • 举报
回复
femark 2009-05-13
  • 打赏
  • 举报
回复
呵呵呵
bigmanvip 2009-05-13
  • 打赏
  • 举报
回复
找了很久资料后,终于找到一个解决方法。原来在sdk中的示例里有一个并行随机数生成算法的示例,MersenneTwister ,用这个方法就可以用cuda并行运算生成近乎完美的随机数。目前我还在研究这个示例的源码,还有些没看懂。
  • 打赏
  • 举报
回复
有并行随机数生成算法的。
  • 打赏
  • 举报
回复
用同余算法生成随机数。然后把伪随机数序列拆成并行的m个序列分别生成。

Xi+1=(a * Xi + c) mod m;
Xi+k=(A * Xi + C) mod m; //一步到位,不依赖于Xi+k-1了
A=a^k mod m;
C=c*(a^k-1 + a^k-2 +...+a^0);
k是一个"跳跃"常数。
若给定m个处理器,则序列中的前m个数将顺序生成,此后这些数中的每一个可并行地用来创建下m个数,接着再生成下m个数,接着再生...

bigmanvip 2009-05-12
  • 打赏
  • 举报
回复
请解释详细点,我找不到相关的资料,或者告诉我一些相关的网址

581

社区成员

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

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