Cuda束表决函数(warp vote)

原创 2015年07月08日 16:01:49

CUDA束表决函数

束表决函数:简单的理解就是在一个warp内进行表决


__all(int predicate):指的是predicate与0进行比较,如果当前线程所在的Wrap所有线程对应predicate不为0,则返回1。

__any(int predicate):指的是predicate与0进行比较,如果当前线程所在的Wrap有一个线程对应的predicate值不为0,则返回1。

__ballot(int predicate):指的是当前线程所在的Wrap中第N个线程对应的predicate值不为0,则将整数0的第N位进行置位。

 

//
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include "device_functions.h"
#include <stdio.h>
 
__global__ void vote_all(int *a, int *b, int n)
{
    int tid = threadIdx.x;
    if (tid > n)
    {
       return;
    }
    int temp = a[tid];
    b[tid] = __all(temp >100);
}
 
__global__ void vote_any(int *a, int *b, int n)
{
    int tid = threadIdx.x;
    if (tid > n)
    {
       return;
    }
    int temp = a[tid];
    b[tid] = __any(temp >100);
}
 
__global__ void vote_ballot(int *a, int *b, int n)
{
    int tid = threadIdx.x;
    if (tid > n)
    {
       return;
    }
    int temp = a[tid];
    b[tid] = __ballot(temp >100);
}
 
int main()
{
    int *h_a, *h_b, *d_a, *d_b;
    int n = 256, m = 10;
    int nsize = n * sizeof(int);
    h_a = (int *)malloc(nsize);
    h_b = (int *)malloc(nsize);
    for (int i = 0; i < n; ++i)
    {
       h_a[i] = i;
    }
    memset(h_b, 0, nsize);
    cudaMalloc(&d_a, nsize);
    cudaMalloc(&d_b, nsize);
    cudaMemcpy(d_a, h_a, nsize, cudaMemcpyHostToDevice);
    cudaMemset(d_b, 0, nsize);
    vote_all<< <1, 256 >> >(d_a, d_b, n);
    cudaMemcpy(h_b, d_b, nsize, cudaMemcpyDeviceToHost);
    printf("vote_all():");
    for (int i = 0; i < n; ++i)
    {
       if (!(i % m))
       {
           printf("\n");
       }
       printf("%d", h_b[i]);
    }
    printf("\n");
    vote_any<<<1, 256 >> >(d_a, d_b, n);
    cudaMemcpy(h_b, d_b, nsize, cudaMemcpyDeviceToHost);
    printf("vote_any():");
    for (int i = 0; i < n; ++i)
    {
       if (!(i % m))
       {
           printf("\n");
       }
       printf("%d", h_b[i]);
    }
    printf("\n");
    vote_ballot<< <1, 256 >> >(d_a, d_b, n);
    cudaMemcpy(h_b, d_b, nsize, cudaMemcpyDeviceToHost);
    printf("vote_ballot():");
    for (int i = 0; i < n; ++i)
    {
       if (!(i % m))
       {
           printf("\n");
       }
       printf("%d", h_b[i]);
    }
    printf("\n");
}


#include <iostream>
 
using namespace std;
 
int main()
{
    int state = 0;
    int start = 10;
    for (int i = start; i <32; ++i)
    {
       state |= (1<< i);
    }
    cout<< state<< endl;
}


 

置位可以用或操作符“|”实现:y = x | (1 << n)  对x的第n位进行置位

清楚可以用与操作符”&“实现:y = x & (~(1 << n))

取反可以用异或操作符”^“实现: y = x ^ (1 << n)

Bit提取操作: bit = (x | (1 << n)) >> n;

cuda版本的word2vec

上篇博客的快排中用到了基于warp的cuda操作用于分隔数组, 为什么要将控制线程的级别定义为warp呢? 在一个warp内,线程的可以通过__ballot函数,并发的获取这32个数中于pivot的...

cuda编程实践

昨天晚上弄到12. 终于迈出了c++到cuda的第一步,经过测试,基本可以确定是真的实现了。表示很兴奋,可是别人并不懂,没地方去庆祝啊。。。。    废话不多说,下面来介绍一下基本的实现过程。(国人在...

束表决函数作用

warp vote是2.0+的一个特性,用来在warp内交换1-bit的信息的。 有三种, 一种是直接将32个1-bit的位,映射成1个32位整数。warp中的线程0,将占据这个映射结果的最低0位,线...

Linux Make 命令详解

无论是在linux 还是在Unix环境 中,make都是一个非常重要的编译命令。不管是自己进行项目开发还是安装应用软件,我们都经常要用到make或make install。利用make工具,我们可以将...

cuda的Shuffle技术以及自定义双精度版本

参考资料: https://devblogs.nvidia.com/parallelforall/faster-parallel-reductions-kepler/

Cuda束表决函数(warp vote)

CUDA束表决函数 束表决函数:简单的理解就是在一个warp内进行表决 __all(int predicate):指的是predicate与0进行比较,如果当前线程所在的Wrap所有线程对应p...

Cuda 学习教程(五):GPU架构-Sp,sm,thread,block,grid,warp

SP(streaming Process),SM(streaming multiprocessor)是硬件(GPU hardware)概念。而thread,block,grid,warp是软件上的(C...

CUDA性能优化----warp深度解析

CUDA性能优化----warp深度解析   2017-01-12 16:41:07|  分类: HPC&CUDA优化 |  标签:gpu  cuda  hpc   |举报 |字号 订阅 ...

CUDA2.1-原理之索引与warp

本小节来自《大规模并行处理器编程实战》第四节,该书是很好的从内部原理结构上来讲述了CUDA的,对于理解CUDA很有帮助,借以博客的形式去繁取间,肯定会加入自己个人理解,所以有错误之处还望指正。 一、块...

CUDA中grid、block、thread、warp与SM、SP的关系

首先概括一下这几个概念。其中SM(Streaming Multiprocessor)和SP(streaming Processor)是硬件层次的,其中一个SM可以包含多个SP。thread是一个线程,...
  • wvh2007
  • wvh2007
  • 2015年11月17日 18:30
  • 1828
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Cuda束表决函数(warp vote)
举报原因:
原因补充:

(最多只允许输入30个字)