k Nearest Neighbor Search by CUDA

kNN(k Nearest Neighbor)是常用的群集算法(Cluster Algorithm)用于空间搜索。目前最快的kNN方法莫过于KDTree的版本,不过基本上都是CPU的比如ANN C++ Library。对于GPU来说,实现加速结构比较复杂,因为没有栈所以无法递归,而且执行资源有限,不能像CPU一样舒舒服服的顺序执行。

为了方便起见我直接用komrade粘合C++与CUDA,下面是测试程序的代码。 

#include <komrade/device_vector.h>
#include <komrade/transform.h>
#include <komrade/range.h>
#include <komrade/copy.h>
#include <komrade/fill.h>
#include <komrade/sort.h>
#include <komrade/replace.h>
#include <komrade/functional.h>
#include <iostream>
#include <iterator>
#include <math.h>
#include <memory>
#include <boost/timer.hpp>

using namespace std;

#include <ANN/ANN.h>
#pragma comment(lib,"ANN.lib")

struct dist
{
    dist(float qx, float qy, float qz) : x(qx), y(qy), z(qz)
    {
    }
    float x,y,z;
    
    __host__ __device__ float operator()(const float3& p) const
    {
        float a = p.x - x;
        float b = p.y - y;
        float c = p.z - z;
        return a*a + b*b + c*c;
    }
};

int main(int argc, char* argv[])
{
    if( argc < 2 )
        return -1;
            
    int N = 0;
    sscanf(argv[1],"%d",&N);
    
    boost::timer Stopwatch;
    ANNpointArray ANNPh = annAllocPts(N,3);
    komrade::host_vector<float3> Ph(N);
    komrade::device_vector<int> Idx(N);
    komrade::device_vector<float> Dist(N);
    
    
    for(int i=0; i<N; ++i)
    {
        float x = (float)rand() / (float)RAND_MAX;;
        float y = (float)rand() / (float)RAND_MAX;;
        float z = (float)rand() / (float)RAND_MAX;;
        
        Ph[i].x = x;
        Ph[i].y = y;
        Ph[i].z = z;
        
        ANNPh[i][0] = x;
        ANNPh[i][1] = y;
        ANNPh[i][2] = z;
                
        if( N < 32 )
            printf("<%f %f %f>\n",x,y,z);
        Idx[i] = i;
    }
    cout<<fixed<<"Generate Data Used "<<Stopwatch.elapsed()<<endl;
    Stopwatch.restart();
        
    float QueryPos[3];
    QueryPos[0] = (float)rand() / (float)RAND_MAX * 0.1f + 0.5f;
    QueryPos[1] = (float)rand() / (float)RAND_MAX * 0.1f + 0.5f;
    QueryPos[2] = (float)rand() / (float)RAND_MAX * 0.1f + 0.5f;
    if( N < 32 )
        printf("[%f %f %f]\n",QueryPos[0],QueryPos[1],QueryPos[2]);
        
    komrade::device_vector<float3> Pd = Ph;
    cout<<fixed<<"Copy Data Used "<<Stopwatch.elapsed()<<endl;
    Stopwatch.restart();
    
    komrade::transform(Pd.begin(), Pd.end(), Dist.begin(), dist(QueryPos[0], QueryPos[1], QueryPos[2]));
    komrade::sort_by_key(Dist.begin(), Dist.end(), Idx.begin());
    cout<<fixed<<"Sort Data by CUDA Used "<<Stopwatch.elapsed()<<endl;
    Stopwatch.restart();
    
    ANNkd_tree ANNTree(ANNPh,N,3);
    ANNidx ANNIdx[1];
    ANNdist ANNDst[1];
    ANNTree.annkSearch(QueryPos,1,ANNIdx,ANNDst);
    cout<<fixed<<"Sort Data by ANN Used "<<Stopwatch.elapsed()<<endl;

    
    if( N < 32 )
    {
        copy(Dist.begin(), Dist.end(), ostream_iterator<float>(cout," "));
        cout<<endl;
        copy(Idx.begin(), Idx.end(), ostream_iterator<int>(cout," "));
    }
    
    
    return 0;
}


下面是性能分析对比,可以看到CUDA版本在大量点的情况下还是非常有优势的,不过在纯RenderFarm就用不上了,恐怕只能在装备有G80以上芯片的桌面环境或者工作站上执行。测试环境如下,

  • Intel E5200@2.9G
  • Apacer 2Gx2
  • 9800GT 512M
  • CUDA 2.2, komrade 0.9
 101001000100001000001000000
CUDA0.0030.0030.003000.0070.0120.038
ANN0.0000.0000.001000.0080.1312.490

 

 

CUDAKNN

极其明显的,当排序数目数量级超过10e5的时候,CUDA显示出了巨大的速度优势。数目比较少的时候还是CPU的比较快速。

启发自《Fast k Nearest Neighbor Search using GPU》

 

《宾馆客房管理系统》是一个基于C#与MySQL的项目,旨在帮助学习者掌握数据库管理和系统开发知识。该项目通过完整代码实现,将编程技术应用于宾馆客房管理的实际业务场景。 C#是微软开发的面向对象编程语言,广泛用于Windows应用程序开发。在本项目中,C#用于构建用户界面、处理业务逻辑以及与数据库交互。它拥有丰富的类库,便于开发复杂图形用户界面(GUI),并通过ADO.NET组件实现与MySQL数据库的连接。MySQL是一种流行的开源关系型数据库管理系统(RDBMS),常用于Web应用程序,用于存储客房、预订、客户等核心数据。通过SQL语句,开发者可对数据进行增、删、改、查操作。系统中可能涉及“客房表”“预订表”“客户表”等,包含客房编号、类型、价格、预订日期等字段。 数据库连接是系统的关键部分。C#通过ADO.NET的SqlConnection类连接MySQL数据库,连接字符串包含服务器地址、数据库名称、用户名和密码。用户下载项目后,需根据本地环境修改连接字符串中的用户名和密码。系统主要功能模块包括:客房管理,可展示、添加、修改、删除客房信息;预订管理,处理预订的查看、新增、修改和取消;客户管理,存储和管理客户个人信息;查询功能,支持按客房类型、价格范围、预订日期等条件查询;报表和统计功能,生成入住率、收入统计等报表辅助决策。开发者需编写C#方法对应数据库操作,同时设计直观易用的界面,方便用户完成预订流程。项目中的MySQL文件可能是数据库脚本或配置文件,包含建表、数据填充及权限设置等内容,用户需在本地测试前运行脚本设置数据库环境。 总之,该系统结合C#和MySQL,为学习者提供了一个涵盖数据库设计、业务逻辑处理和界面开发的综合实践案例,有助于提升开发者在数据库应用和系统集成方面的能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值