我在host函数端cudaMalloc一个指针a,然后给一个初始值,比如说a[0]=1,再作为参数传递给kernel函数。kernel就做a[tid]=a[tid]+a[tid-1]这个运算。那每个线程tid进行运算时也无法知道a[tid-1]上的数啊,这该怎么办?就只能串行运算了么?
LZ您好,您的叙述有诸多不确之处,下面将大致指出:
1:“我在host函数端cudaMalloc一个指针a”,您打算申请device端的一段线性缓冲区,并将其地址保存给指针a?
2:“然后给一个初始值,比如说a[0]=1,再作为参数传递给kernel函数”,如果您申请的是一段线性缓冲区,那么您确定您只给第一个值初始化么?
3:“kernel就做a[tid]=a[tid]+a[tid-1]这个运算。”,您的tid指的是通常意义下的线程编号吗?以及您这样做和您只给a[0]初始化的行为相一致么?这里面会出现使用到未初始化的变量的。
4:“那每个线程tid进行运算时也无法知道a[tid-1]上的数啊”,请解释您这句话的理由。任何一条线程都可以通过传入的指针a访问您之前申请的那段线性缓冲区的全部内容的。
5:“这该怎么办?就只能串行运算了么?”因为您前一句不成立,所以此句也不成立。
大致分析如此,望LZ搞清楚CUDA的基本概念和自己的基本意图,再予以解释上述各条。
祝您编码顺利~
首先谢谢您。我说的可能不太好哈。就是这样的,我做一个解码程序,然后用tid做线程号。a[SIZE]是一个在global memory上的一个数组,并传递给kernel函数。我想用kernel计算出a[SIZE]的所有值,而每个a[tid]的值的计算都需要a[tid-1]的参与。也就是说,不计算出a[1]的值我就没法得到a[2]的值。但是cuda中的每个线程不是并行的么,在计算a[tid]的值时,a[tid-1]也是在同时计算着,这该怎么办?
LZ您好,如果您的算法有这样的数据依赖性,那么在GPU上也只能串行执行了(比如只有一个线程干活,反复循环什么的。)。以及如此一来,在GPU上跑可能很不划算,会比CPU慢很多。
所以如果真的如此的话,那么建议您CPU实现吧。
如果这只是您总体处理的一小部分,还有大量可以并行内容,那么如果是为了避免反复在host和device端传递数据,您也可以考虑将这一段放在device上执行。
大致建议如上,供您参考。
祝您好运~
恩,谢谢您。看来也只能是这样了,用cuda做信号处理我还得再仔细研究研究。。。
不客气的,欢迎您常来论坛~
祝您编码顺利~