system
1
这个CPU程序,怎么改成GPU内核函数
int count = 0;
int* func(inta,intb,int*c){
for(int i =0 ;i<n; i++){
if(a[i]+b[i]>10){
c[count++] = a[i]+b[i];
}
}
}
记得count从零开始的,
我自己写GPU程序(错误的),我想count所有线程共享,
device int count = 0;
global void MatAdd(int * A,int* B,int* C)
{
int tid = threadIdx.x + blockIdx.x*blockDim.x;
if(tid< N ){
if(A[tid]+B[tid]>10){
C[count] = A[tid]+B[tid];
count++;
}
}
}
system
2
if (A[tid]+B[tid]>10)
{
int count_temp=atomicAdd(&count,1);
C[count_temp]=A[tid]+B[tid];
}
这样或许可以,当然你自己需要保证C足够大,不能写越界了。
祝您编码愉快~
system
4
这个实不敢当,实际上这是一个比较简单的问题,而且你在群里问的时候,樟树已经答复你这么做了,我不过是把樟树的答复写成两三行代码出来给你看而已。
之所以昨天在群里没有解决,是因为你昨天叙述的实现和今天叙述的实现是不同的,你今天才清楚地叙述了CPU的实现代码,并且这个代码是比较容易并行化的。
祝您编码愉快,多来论坛和群里交流~
system
5
另外,必须指出的是,2#给出的并行实现与1#给出的串行实现的行为并不是完全等价的,2#的结果,C中的值的个数和串行实现是一致的,元素也依然是那些元素,但是顺序并不保证和1#一致。因为多个线程一起上的时候,并不保证他们之间的顺序性。
这一点请LZ务必注意,如果需要保证C元素顺序也和1#中的串行算法顺序一致,那么2#给出的代码是不行的。
system
6
哈哈,结果顺序不需要保持一致,所以这样是可以的,:lol
system
7
那还好,同时,如果需要GPU结果在顺序上也和CPU结果一致,那么我觉得可以使用GPU上每个线程循环完成连续的一段A,B的判断,比如thread 0判断A[0]~A[127],thread 1判断128~255,每个线程维护自己的结果,最后再把结果拼接成总的C.
另外,LZ还可以测试看看这个算法并行后加速效果如何,因为这个算法可能速度会收到访存速度的限制。
祝您编码愉快。