楼主: 图腾部落

6月28日更新--“如何并行化我的应用”方案有奖征集活动--获奖名单公布

[复制链接]
论坛徽章:
19
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44版主1段
日期:2012-05-15 15:24:112012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252011新春纪念徽章
日期:2011-02-18 11:42:502011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:33
21#
 楼主| 发表于 2010-5-27 11:40 | 只看该作者
想参赛的朋友请抓紧时间,本活动参赛作品提交截止日期为6月15日。

使用道具 举报

回复
论坛徽章:
1
2011新春纪念徽章
日期:2011-02-18 11:43:33
22#
发表于 2010-5-28 13:34 | 只看该作者

回复 #19 yyfn风辰 的帖子

请教不敢当啊,十分欢迎交流切磋哈;)

使用道具 举报

回复
论坛徽章:
0
23#
发表于 2010-5-31 14:52 | 只看该作者
围观一下...不说话

使用道具 举报

回复
论坛徽章:
20
2010新春纪念徽章
日期:2010-03-01 11:20:002012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:25版主1段
日期:2012-05-15 15:24:11马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:12:25
24#
发表于 2010-6-7 08:46 | 只看该作者
我就直接发代码参赛吧,多少钱随便给

使用道具 举报

回复
论坛徽章:
19
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44版主1段
日期:2012-05-15 15:24:112012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252011新春纪念徽章
日期:2011-02-18 11:42:502011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:33
25#
 楼主| 发表于 2010-6-7 10:28 | 只看该作者
原帖由 cyrosly 于 2010-6-7 08:46 发表
我就直接发代码参赛吧,多少钱随便给


别纯代码,配点说明,至少项目背景大概说下。

使用道具 举报

回复
论坛徽章:
0
26#
发表于 2010-6-7 19:18 | 只看该作者
K近邻算法基于CUDA的实现

前面看到有个人写了个k-均值算法,我今天就写个k近邻算法看看!

KNN 算法的基本思想是:将文本内容形式化为特征空间中的向量,每个文本就是一个向量,向量的每维数据代表不同的内容。对于一个测试文本, 计算它与已分类样本集中每个文本的相似度, 找出K 个最相似的文本, 根据这k个文本中属于那个类的文本最多,以此判断测试文本所属的类别。具体算法步骤如下:
( 1) 将待分类文本特征化为向量a
( 2) 计算该测试文本与训练集中每个文本的文本(特征化为向量b)相似度, 计算公式为: cos = ab/(|a||b|)
( 3) 按照文本相似度, 在训练文本集中选出与测试文本最相似的k 个文本。
( 4) 在测试文本的k 个近邻中, 依次计算每类的权重。本文权重定义为文本数
( 5) 比较类的权重, 将文本分到权重最大的那个类别中。

CUDA实现

  1. typedef struct text{
  2.         unsigned int len;//text number
  3.         unsigned int dim;//text’s dimension
  4. //every text have a row, column first
  5.         float *textData;
  6.         unsigned int pitch;//use to access textData
  7. }text;
复制代码


text结构中,len 表示所有文本的数量;dim 表示每个文本向量的维数;textData 表示所有的文本数据,每列代表一个文本的特征信息,pitch 是用cudaMallocPitch分配数据时返回的值除以4,也就是textData每行的长度。
下面的代码用于计算两个文本的相似度

  1. //first ,second : text index
  2. __host__ __device__ float homo(text t, int first, int second){
  3.         float mul = 0.0f;
  4.         float o2 = 0.0f, tw2 = 0.0f, temp1, temp2;
  5.        
  6.         for(int I = 0; I < t.dim; i++){
  7.                 temp1 = t.textData[first + t.pitch*i];
  8.                 temp2 = t.textData[second + t.pitch*i];
  9.                 mul += temp1*temp2;
  10.                 o2 +=temp1*temp1;
  11.                 tw2 += temp2*temp2;
  12. }

  13.         return mul/sqrtf(o2*tw2);
  14. }
复制代码


内核函数大致如下:其基本思想相当简单,就是每个线程处理自己的那一亩三分地。

  1. __global__ void knnKernel(Text t,int k, int * d_belongTo){
  2.         Int id = blockDim.x*blockIdx.x + threadIdx.x;

  3.         float knn[K];
  4.         int index[K];

  5.         for(int I =0; I < k; i++){
  6.                 index[i] = 0;
  7.                 knn[i]= 0.0f;
  8.         }

  9.         If( id >= t.len)
  10.                 return;

  11.         float temp =home(…);
  12. //遍历knn,将temp插入其中,丢弃最小的那个并记录其所属的类

  13. …………………

  14. }
复制代码

由于流多处理器中的寄存器数量有限,所以K值不能太大,具体大小依据硬件每个 SM寄存器的数目以及每个线程块的线程数决定,由于 CUDA 目前还不支持动态数据,因此只能使用宏,这样保证了在实际使用的k值小于预定义的K时,依旧会被分配到寄存器中,但是一旦k大于K时,就要重新处理了。

[ 本帖最后由 lloves 于 2010-6-7 19:21 编辑 ]

使用道具 举报

回复
论坛徽章:
19
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44版主1段
日期:2012-05-15 15:24:112012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252011新春纪念徽章
日期:2011-02-18 11:42:502011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:33
27#
 楼主| 发表于 2010-6-7 19:52 | 只看该作者
原帖由 lloves 于 2010-6-7 19:18 发表
K近邻算法基于CUDA的实现

前面看到有个人写了个k-均值算法,我今天就写个k近邻算法看看!

KNN 算法的基本思想是:将文本内容形式化为特征空间中的向量,每个文本就是一个向量,向量的每维数据代表不同的内容。对于一个测试文本, 计算它与已分类样本集中每个文本的相似度, 找出K 个最相似的文本, 根据这k个文本中属于那个类的文本最多,以此判断测试文本所属的类别。具体算法步骤如下:
( 1) 将待分类文本特征化为向量a
( 2) 计算该测试文本与训练集中每个文本的文本(特征化为向量b)相似度, 计算公式为: cos = ab/(|a||b|)
( 3) 按照文本相似度, 在训练文本集中选出与测试文本最相似的k 个文本。
( 4) 在测试文本的k 个近邻中, 依次计算每类的权重。本文权重定义为文本数
( 5) 比较类的权重, 将文本分到权重最大的那个类别中。

CUDA实现

typedef struct text{
        unsigned int len;//text number
        unsigned int dim;//text’s dimension
//every text have a row, column first
        float *textData;
        unsigned int pitch;//use to access textData
}text;


text结构中,len 表示所有文本的数量;dim 表示每个文本向量的维数;textData 表示所有的文本数据,每列代表一个文本的特征信息,pitch 是用cudaMallocPitch分配数据时返回的值除以4,也就是textData每行的长度。
下面的代码用于计算两个文本的相似度

//first ,second : text index
__host__ __device__ float homo(text t, int first, int second){
        float mul = 0.0f;
        float o2 = 0.0f, tw2 = 0.0f, temp1, temp2;
       
        for(int I = 0; I < t.dim; i++){
                temp1 = t.textData[first + t.pitch*i];
                temp2 = t.textData[second + t.pitch*i];
                mul += temp1*temp2;
                o2 +=temp1*temp1;
                tw2 += temp2*temp2;
}

        return mul/sqrtf(o2*tw2);
}


内核函数大致如下:其基本思想相当简单,就是每个线程处理自己的那一亩三分地。

__global__ void knnKernel(Text t,int k, int * d_belongTo){
        Int id = blockDim.x*blockIdx.x + threadIdx.x;

        float knn[K];
        int index[K];

        for(int I =0; I < k; i++){
                index = 0;
                knn= 0.0f;
        }

        If( id >= t.len)
                return;

        float temp =home(…);
//遍历knn,将temp插入其中,丢弃最小的那个并记录其所属的类

…………………

}

由于流多处理器中的寄存器数量有限,所以K值不能太大,具体大小依据硬件每个 SM寄存器的数目以及每个线程块的线程数决定,由于 CUDA 目前还不支持动态数据,因此只能使用宏,这样保证了在实际使用的k值小于预定义的K时,依旧会被分配到寄存器中,但是一旦k大于K时,就要重新处理了。

使用道具 举报

回复
论坛徽章:
20
2010新春纪念徽章
日期:2010-03-01 11:20:002012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:25版主1段
日期:2012-05-15 15:24:11马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:12:25
28#
发表于 2010-6-8 06:33 | 只看该作者
Be cleared

[ 本帖最后由 cyrosly 于 2010-6-30 10:22 编辑 ]

使用道具 举报

回复
论坛徽章:
21
2010新春纪念徽章
日期:2010-03-01 11:08:292012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:25版主3段
日期:2012-05-15 15:24:11马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:12:25
29#
发表于 2010-6-8 11:01 | 只看该作者

回复 #28 cyrosly 的帖子

有时间研究一下你的代码,呵呵!

使用道具 举报

回复
论坛徽章:
0
30#
发表于 2010-6-9 15:01 | 只看该作者

回复 #27 图腾部落 的帖子

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表