我传递到设备上的数据是double* CudaDat, 是一个24*53 double数组,由于在设备上要频繁的访问 CudaDat 里面的数据,所以我在核函数里面讲所有数据一次考入共享存取器里面(核函数只有一个块,32个线程,我只用到整个块中的前24个线程,每次提取共享存取器里面的一行24个double数据进行处理,我的显卡是GTX650TI,64K的共享存取器),以便我频繁的访问共享存取器,我想请问的是,这里共享存取器里面对双精度的访问是否存在访问冲突的问题呢???
LZ您好:
1:您的GPU是kepler核心的,如果您将您的shared memory配置为8B bank模式,将无bank conflict。否则每个bank的宽度是4B,需要两个相邻的bank合作才能得到一个8B宽度的double数据,则每次只能为16个线程服务,您的24个线程需要访问两次才行。
2:以及在您的GPU上,shared memory最大可以配置为每SMX 48KB,而不是您宣称的64KB。
3:以及,您的线程使用量太小,将极大地影响GPU的效率,希望您能明白这一点,并改写您的代码为效率较高的形式。
大致如此,祝您好运~
弱弱的请问一下版主,shared memory配置,是怎么配置的 ,以前没有配置过:L
LZ您好:
请您参阅一下CUDA C Programming Guide,里面有详细的配置方法。
祝您好运~
好的 谢谢!
我倒是感觉,不用说楼主如何配置shared memory了,
他最大问题就是一共才用了32个(24个)线程来运行。
(1)再怎么尝试使用cudaDevice/FuncSetCacheConfig,楼主你也不会提升太多。
(2)但是如果你修改算法,避免只用32个线程,才能有效的几倍,几十倍,几百倍的提升效率。
请楼主三思。
没办法啊,老板硬要我对这个算法优化一下,这么多天下来,也没用多大的改进,我也是很苦恼啊。说到这里,我也想请教一下版主,我要改进的是一个PSO(粒子群优化)算法。有24个点,每个特征点是17维的,每个特征点包含一个17维的速度double数组,一个17维的位置double数组,一个17维的最佳位置double数组,以及一个匹配度以及最佳匹配度。要对这24个特征点循环迭代3000次。我尝试各种方法:比如用一个块,里面32个线程,每个线程处理一个特征点的数据,同时注意数据的访问合并,以及使用共享存储器,常量存储器,注意共享存储器的访问冲突问题。但是优化效果还是一般般。
我觉得这个程序的数据量本来就不大,最主要的迭代次数(3000次),也不能用每个线程单独实现,所有用CUDA编程效果不会很理想,不知道我的做法以及理解方式对不对,求版主指点!!!
LZ您好:
我不懂PSO算法,如果您的算法是某种迭代算法,同时每一步迭代又无法很好地并行化/无法有足够的可并行的计算量,那么您的算法可能不适合GPU实现,请不要“为了GPU而GPU”。
以及,我不懂PSO所以上述建议仅是在对您的描述内容的一般理解意义下作出的。不排除可能有效率很高的PSO并行方法,但这需要您去寻找/实现,我无法给出建议。
祝您好运,早日成功摆平BOSS~
嗯嗯 谢谢版主的回答。
:):3_48:
祝您好运~
请问一下版主 我想系统的学习CUDA相关知识(成为版主一样的大牛),并一直从事这方面的工作,应该具备哪些相关知识,了解哪些方面的内容,现在学习得很迷茫,求版主指点一下。。。
LZ您好:
斑竹不是大牛的,无法回答您“如何成为大牛”的问题,见谅。
如果要入门的话,官方手册、国外大学CUDA教程(有视频和讲义可看)、常来论坛潜水,算是三条捷径。
祝您好运~
英语不行,国外视频是看不懂了,官方手册勉强看的懂些,看来只有常来灌水了~~~
LZ您好:
视频您可以找找看有没有带字幕翻译的版本。
官方手册有中译本的,您可以和原版对照着看。
祝您好运~
好的 谢谢版主~~
PSO 还是 MPI 比较好 不太适合gpu
赞同恒大的说法,不能为了GPU而GPU
国庆快乐!