CUDA实现平衡树求前缀和
来源:互联网 发布:qsv格式转换软件 编辑:程序博客网 时间:2024/05/21 03:26
应实验要求,使用CUDA实现平衡树的前缀求和算法,很可惜只是做了一个简单的版本,没有时间做更多的优化,在此记录下来以后在进行深入优化。
平衡树求前缀和的思想是使用逻辑上的树形结构,先一次遍历所有叶子节点实现相邻的两个节点相加,层层上播直到根节点。然后从根节点在执行一次向下的播送过程,最后所有的前缀和都是存放在叶子节点中。
为了简单起见使用一维数组保存所有的叶子节点和相应的中间节点,然后使用一些小标小技术让其满足逻辑上的树形结构。
插入串行代码:
int GetJump(int n,int step){int i;int sum = 0;if(step == 0)return 0;for(i = 1;i <= step;i *= 2)sum += n / i;return sum;}void PrefixST(int *input,int n){int h,k,a,b;int broadcastA,broadcastB;int step = 1;/* Up Sum*/for(h = n / 2;h > 0;h /= 2){for(k = 0;k < h;k++){a = 2 * k + GetJump(n,step / 2);b = 2 * k + 1 + GetJump(n,step / 2);input[GetJump(n,step) + k] = input[a] + input[b];}step *= 2;}/* Down Broadcast*///printf("step : %d",step);step /= 2;for(h = 1;h < n;h *= 2){for(k = 0;k < h;k++){if(k == 0){broadcastA = input[k + GetJump(n,step)];a = 2 * k + 1 + GetJump(n,step / 2);input[a] = broadcastA;}else {broadcastA = input[k + GetJump(n,step)];broadcastB = input[k + GetJump(n,step) - 1];a = 2 * k + GetJump(n,step / 2);b = 2 * k + 1 + GetJump(n,step / 2);input[a] += broadcastB;input[b] = broadcastA;}}step /= 2;}}
然后依据这个串行代码做一些小小的改进就能得到CUDA的代码,其中把循环遍历改为线程的tid就行。这里使用最简单的1 blocks,n 列threads的方式,为了与一维数组进行很好的关联,便于操作线程。
插入并行代码:
使用CUDA的自带计时器:发现时间效果很差,并行的算出来还没得串行的好,看来还有很大的优化空间...
float time;cudaEvent_t start,stop;cudaEventCreate(&start);cudaEventCreate(&stop);cudaEventRecord(start,0);/*Function runs*/cudaEventRecord(stop,0);cudaEventSynchronize(stop);cudaEventElapsedTime(&time,start,stop);
- CUDA实现平衡树求前缀和
- 平衡树法求前缀和--内容讲解及多线程实现源码
- 平衡树法求前缀和--内容讲解及多线程实现源码
- 平衡树法求前缀和--内容讲解及多线程实现源码
- 平衡树法求前缀和--内容讲解及多线程实现源码
- 平衡树法求前缀和--内容讲解及多线程实现源码
- POJ2352_Stars_线段树求前缀和
- mpi求前缀和
- 求n维前缀和
- 二叉索引树,求前缀数组和,区间和
- 求二叉树的深度和宽度平衡最大距离
- openMP编程,求前缀和,注意事项
- 积性函数求前缀和
- Perl 前缀树实现
- 前缀树的实现
- 递归多线程实现前缀和
- HDU 5147 Sequence II (线段树求前缀和、后缀和)
- Trie树的编程实现,用于计算字符串出现次数,求公共前缀字符串等问题
- 十九 设计模式之访问者模式
- 二十 设计模式之状态模式
- Windows XP 上 KB977377导致证书不可用问题
- Fedora如何删除旧内核?
- (spring2.x整合)applicationContext-dao.xml
- CUDA实现平衡树求前缀和
- 二十一 设计模式之解释器模式
- Android字符串资源及其格式化
- 二十二 设计模式之享元模式
- 堪称一绝的“IO口扫键”法
- AutoCAD .NET API基础(一) AutoCAD 对象层次结构(3)
- 【转】19 个漂亮的 jQuery 画廊和幻灯片插件
- 二十三 设计模式之桥梁模式
- asp.net(C#)中的flash怎么添加在加载时不能显示出来--解决