CUDA编程中遇到while循环嵌套问题,在GPU端每一个线程运行一个循环嵌套,多个线程同时运行多个循环嵌套。貌似比在CPU端一个一个的运行速度还要慢很多。不知道这类问题有没有解决方法。
LZ您好:
请提供您的具体情况,这样笼统地问无法回答的。
祝您好运~
ice版主您好,我之前请教过的,这点还是没弄出来,麻烦您再给看下了。
_global(…)
{
int tid=threadIdx.x+blockIdx.xblockDim.x;
while( d_min_pq[tid].n>0 && t<200 )
{
minpq_extract_min(&d_min_pq[tid],&d_expl[tid]);
explore_to_leaf(&d_min_pq[tid],&d_expl[tid],&d_unexpl[tid],&d_feat[tid],d_kd_node_sum);
}
}
device void explore_to_leaf(struct min_pq min_pq,struct kd_node* expl,struct kd_node* unexpl,struct feature* feat,struct kd_node* kd_node_num)
{
double kv;
int ki;
while( expl && ! expl->leaf )
{
ki=expl[0].ki;
kv=expl[0].kv;
if(ki>=feat->d)
{
return;
}
if(feat->descr[ki]<=kv)
{
unexpl[0] = kd_node_num[expl[0].index_right];
expl[0] = kd_node_num[expl[0].index_left];
}
else
{
unexpl[0] = kd_node_num[expl[0].index_left];
expl[0] = kd_node_num[expl[0].index_right];
}
if(minpq_insert( min_pq,unexpl,ABS(kv-feat->descr[ki] ) ) )
{
return;
}
}
}
global函数中的while和explore_to_leaf中的while构成有依赖关系的循环嵌套,多次循环。速度比在CPU上还要慢很多。不知道应该怎么改。
LZ您好:
您这样写的代码可能会出现大量warp内部的分支的,而且各个循环的次数很可能无法统一。
这个真心无法直接看出来并给您优化建议了,请您根据您的算法意图考虑适合GPU的实现。
祝您好运~
楼主可以重新给出自己的问题,而不是你的粗糙的实现。
让我们重新审视问题,而不是就这你对问题的理解给出的代码继续思考下去,也许会有新的启发。
请您阐述一下您的问题。