近期应学习的需要,老师要求研究一下GPU下数据库的实现,并发给我一篇名为《Relational Query Co-Processing on Graphics Processors》的文章,这篇文章详细介绍了各种基于GPU的并行算法,同时对数据库的各种底层操作进行相应具体的实现。文章最终表现为一个叫GDB的项目,项目源码可以在http://www.cse.ust.hk/gpuqp/下载,项目一共有六十多个文件组成。里面包括三个部分,单独GPU实现,单独CPU实现和GPU-CPU联合实现,并对他们的性能做了比较。我的任务是读懂这些代码并让它们跑起来。现在与到一个问题:在文件StringCmp.cu有一个函数__device__ int getCompareValue(void *d_rawData, int v1, int v2);这个函数在多个文件中有用到(代码的重用性),现在vs2010中问题来了:1,如果在那多个文件中都包含StringCmp.cu,就提示函数重定义;2,如果不包含,则提示找不到函数,;3,如果我在文件的开头声明一下getCompareValue,则提示External calls are not supported (found non-inlined call to **)。这些错误的原因都很直接,1是因为多个函数包含文件的函数定义,必定会提示函数重定义,2如果不定义,则编译器不知道函数在哪儿,3是CUDA的语法要求,__device__函数必须在内部调用。希望能有高手帮忙解答一下,困扰我快一个月了,谢谢!同时提出一个问题:怎么合理组织cuda项目中各文件之间的关系,才能避免出现上面的问题?
:)快来人啊!
个人观点:
1、能不能在该函数前声明extern “C”,这样只要这些文件都在一个项目中,那么就不需要再包含该文件了。但是我试过CUDA中可能不一定支持对设备端的函数或变量用extern
2、不行的话将该文件的后缀名改为.cuh,然后在文件头部宏定义,ifndef xxxx, define XXXX,最后在文件末尾endif,这样应该可以在其他文件中都包含它了。
如果不正确请谅解
学习了。呵呵
顶一下 哈俣
请高手帮忙 ,不太清楚
[
这几天又仔细想了想,__device__函数只要是通过定义在多个文件中引用,最终免不了重定义,如果用ifndef,则只有一个文件能用到,所以要想用到多个文件中必须通过声明extern,但是这个又不允许。
所以,感觉目前的CUDA是不支持device内核函数重用的,而只能通过hostC语言进行封装,而从更高级别来对内核函数进行重用。
呵,只是个人见解,不知道对不对,希望大家也发表一下意见,找个好方式来重用内核函数。