我需要找到一个数组中的最小索引。使用一个线程很容易做到这一点,但是我想使用并行线程来减少它。
我使用一个线程(如果threadIDx.x == 1)完成了工作……。但是并行执行此操作将提高我正在寻找的效率。
我写了这段代码,对我来说看起来很合逻辑。但是当我调试它时根本没有选择最小值!
代码:
#define MIN(x,y) ((x < y) ? x : y)
#define MIN_IDX(x,y, idx_x, idx_y) ((x < y) ? idx_x : idx_y)
....
....
__shared__ int costs[nt];
__shared__ int bstids[nt];
int myM = 9999999;
int mtMId;
for (int s = nt/2 ; s >= 1 ; s/=2) {
if (threadIdx.x < s) {
myM = MIN(costs[threadIdx.x], costs[threadIdx.x+s]);
costs[threadIdx.x] = myM;
mtMId = MIN_IDX(costs[threadIdx.x], costs[threadIdx.x+s],bstids[threadIdx.x], bstids[threadIdx.x+s]);
bstids[threadIdx.x] = mtMId;
__syncthreads();
}
}
nt是线程数及其2的幂。
答案 0 :(得分:1)
我只是试图移动__syncthreads();到if条件之外,并且看起来可行。