记录一下工作中cuda编程遇到的坑
- cuda锁内卡死
cuda编程中共享区间的锁一般会由一个int* 实现,如:
int* lock;
cudaMemset(lock,0);
bool lp = true;
while( lp ){
int mark = atomicCAS(lock , 0 , 1);
if(mark == 0){
lp = false;
if(){
// do ...
}
else{
//do ...
}
atomicExch(lock,0);
}
}
这段代码里面的do … 后面一定不能写return语句,不然就会卡死。只能continue;然后在函数末尾写return;至于为什么我不知道。。。
- 莫名其妙的线程竞争
如果要用回收和分配id的操作,最好不要使用一个数组同时回收和分配,有时候明明代码看着不会有线程竞争,但他实际就是会有。。。这时候没加锁就出问题了 - 局部变量的原子操作
核函数内的临时变量就不要用atomicExch赋值了,会崩。。。 - switch的性能问题
gpu是没有分支预测的,if语句如果两种情况都会发生,那么一个warp会等第一种线程执行完然后执行第二种,相当于耗了2倍时间。
同理如果switch里面有10个case,那他就会变成10倍的时间。。。。 - _ global _ 函数传参不能传引用,最多传指针