gpt4 book ai didi

CUDA 共享内存阵列 - 奇怪的行为

转载 作者:行者123 更新时间:2023-12-01 13:08:25 25 4
gpt4 key购买 nike

在 CUDA 内核中,我有类似于以下的代码。我试图为每个线程计算一个分子,并在 block 上累加分子以计算分母,然后返回比率。但是,CUDA 将 denom 的值设置为 block 中具有最大 threadIdx.x 的线程为 numer 计算的任何值,而不是 block 中所有线程计算的 numer 值的总和。有谁知道这是怎么回事吗?

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;

“结果”应始终介于 0 和 1 之间,并且整个 block 的总和应为 1,但对于每个线程,它等于 1.0,其中 threadIdx.x 是最大值,并且一些其他值不限于范围 block 中的其他线程。

最佳答案

您没有将求和正确同步到 blockDim.x 位置。在添加它们的总和之前,没有一个线程在等着看其他人写了什么。有点像

  • 每个人都读零,
  • 回家,计算零 + 数字。
  • 每个人都将零+数字写入内存位置

高 threadId 获胜,因为它很有可能最后行动,我想。

为了快速求和,您想要做的是对s_shared[threadIdx.x]

  • 每个人都写下他们的号码
  • 一半的线程计算对的总和并将它们写入新位置
  • 四分之一的线程计算成对的总和,并将它们写入新位置
  • 等等
  • 直到你只有一个线程和一个总和

这需要 O(n) 的工作量和 O(log n) 的时间。

关于CUDA 共享内存阵列 - 奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1071379/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com