在CUDA中使用结构体,比如这种形式:
struct saxpy_functor
{
const float a;
saxpy_functor(float _a) : a(_a) {}
__host__ __device__ float operator()(const float& x, const float& y) const { return a * x + y; }
};
这样,结构体里就具有了cuda的存储类型的成员。
cuda中还经常出现reduce操作。搜了一下,还是浙大的一个学姐写得详细:
http://blog.youkuaiyun.com/abcjennifer/article/details/43528407
下面还有一个cuda结构体分配存储空间的例子:
http://blog.youkuaiyun.com/wang11234514/article/details/18664139
********
如果涉及链表,则网上给出的解答是:
另外一篇海洋大学的文章则称,CUDA6的统一寻址提供了很好的解决办法。http://www.ouccloud.com/356.html
下面是一个用到统一寻址功能的排序:http://bbs.youkuaiyun.com/topics/310264284
相关的各种排序:http://blog.sina.com.cn/s/blog_a1243c1901014w9h.html
对于cuda,还涉及运算符重载。下面有一个牛人的总结:https://wuyuans.com/2012/09/cpp-operator-overload/
忽然想到java和python。java不支持运算符重载,而phthon支持。
(1) 一般情况下,单目运算符最好重载为类的成员函数;双目运算符则最好重载为类的友元函数。
(2) 以下一些双目运算符不能重载为类的友元函数:=、()、[]、->。
(3) 类型转换函数只能定义为一个类的成员函数而不能定义为类的友元函数。
(4) 若一个运算符的操作需要修改对象的状态,选择重载为成员函数较好。
(5) 若运算符所需的操作数(尤其是第一个操作数)希望有隐式类型转换,则只能选用友元函数。
(6) 当运算符函数是一个成员函数时,最左边的操作数(或者只有最左边的操作数)必须是运算符类的一个类对象(或者是对该类对象的引用)。如果左边的操作数必须是一个不同类的对象,或者是一个内部 类型的对象,该运算符函数必须作为一个友元函数来实现。
这篇博客探讨了在CUDA中如何使用结构体,包括结构体在CUDA中的存储分配和reduce操作。同时,文章提到了CUDA6的统一寻址在处理链表问题上的应用,并分享了几个关于CUDA排序的实例。此外,还讨论了C++中的运算符重载,给出了何时选择成员函数和友元函数的指导原则。
2306

被折叠的 条评论
为什么被折叠?



