代码之家  ›  专栏  ›  技术社区  ›  Jacob Lyles

CUDA共享内存阵列-行为异常

  •  3
  • Jacob Lyles  · 技术社区  · 17 年前

    denom numer 按块中最大的线程 threadIdx.x ,而不是

    extern __shared__ float s_shared[];
    
    float numer = //calculate numerator
    
    s_shared[threadIdx.x] = numer;
    s_shared[blockDim.x] += numer;
    __syncthreads();
    
    float denom = s_shared[blockDim.x];
    float result = numer/denom;
    

    result 应该始终在0和1之间,并且整个块的总和应该为1,但对于每个线程,它都等于1.0,其中 threadIdx。X

    1 回复  |  直到 3 年前
        1
  •  4
  •   rampion    17 年前

    您没有将求和正确同步到 blockDim.x 位置。没有一个线程在加和之前等待看到其他线程写了什么。有点像

    1. 回家后,计算为零+ numer .
    2. 每个人都写零+ 到内存位置

    高线程ID赢得b/c,我想它很有可能最后行动。

    s_shared[threadIdx.x]

    1. 四分之一的线程计算成对线程的总和,并将其写入新位置
    2. 等等
    3. 直到你只有一个线程和一个总和