在共享内存中查找数组的最小索引的问题

时间:2019-04-02 10:05:24

标签: cuda

我需要找到一个数组中的最小索引。使用一个线程很容易做到这一点,但是我想使用并行线程来减少它。

我使用一个线程(如果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的幂。

1 个答案:

答案 0 :(得分:1)

我只是试图移动__syncthreads();到if条件之外,并且看起来可行。