当前位置:  开发笔记 > 编程语言 > 正文

在循环中使用Thrust优化CUDA

如何解决《在循环中使用Thrust优化CUDA》经验,为你挑选了1个好方法。

给出以下代码片段,使用推力生成一种带CUDA的代码字典(CUDA的C++模板库):

thrust::device_vector dCodes(codes->begin(), codes->end());
thrust::device_vector dCounts(counts->begin(), counts->end());
thrust::device_vector newCounts(counts->size());

for (int i = 0; i < dCodes.size(); i++) {
    float code = dCodes[i];
    int count = thrust::count(dCodes.begin(), dCodes.end(), code);

    newCounts[i] = dCounts[i] + count;

    //Had we already a count in one of the last runs?
    if (dCounts[i] > 0) {
        newCounts[i]--;
    }

    //Remove
    thrust::detail::normal_iterator > newEnd = thrust::remove(dCodes.begin()+i+1, dCodes.end(), code);
    int dist = thrust::distance(dCodes.begin(), newEnd);
    dCodes.resize(dist);
    newCounts.resize(dist);
}

codes->resize(dCodes.size());
counts->resize(newCounts.size());

thrust::copy(dCodes.begin(), dCodes.end(), codes->begin());
thrust::copy(newCounts.begin(), newCounts.end(), counts->begin());

问题是,通过使用CUDA视觉分析器,我注意到4个字节的多个副本.IMO这是由生成的

    循环计数器i

    float代码,int countdist

    每次访问i和上面提到的变量

这似乎减慢了一切(顺序复制4个字节并不好玩......).

那么,我是如何告诉推力的,这些变量应该在设备上处理?或者他们已经?

使用thrust :: device_ptr对我来说似乎不够,因为我不确定for循环是在主机上还是在设备上运行(这也可能是缓慢的另一个原因).



1> Anycorn..:

对于i的每次重复,大小,索引,代码等都必须从主机复制到设备..你拥有程序的方式,你可以做的并不多.为获得最佳效果,请考虑在设备上移动整个i循环,这样您就不会拥有设备副本.

信任对于某些事情是很好的,但是在性能方面并且算法不太适合可用函数的情况下,您可能必须重写以获得最佳性能而无需明确使用推力算法.

推荐阅读
虎仔球妈_459
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有