- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
编辑: 我已将此作为错误提交到 https://developer.nvidia.com/nvidia_bug/3711214 .
我正在编写一个数值模拟程序,该程序在 Release模式下给出了微妙的错误结果,但在 Debug模式下却给出了看似正确的结果。原始程序使用 curand 进行随机采样,但我已将其简化为更简单且更具确定性的 MVCE,它启动 1 个 block * 1 个扭曲(32 个线程)的单个内核,其中每个线程:
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>
__global__ void test_kernel()
{
int cSteps = 0;
int cIters = 0;
float pos = 0;
//curandState localState = state[threadIdx.x];
while (true) {
float rn = threadIdx.x * 0.01 + 0.001;
pos += rn;
cSteps++;
if (pos > 1.0f) {
pos = 0;
cIters++;
if (cSteps > 1024) {
break;
}
}
}
printf(" 0: Th %d cI %d\n", threadIdx.x, cIters);
__syncthreads();
cSteps += __shfl_xor_sync(0xffffffff, cSteps, 1, 32);
cIters += __shfl_xor_sync(0xffffffff, cIters, 1, 32);
printf(" 1: Th %2d cI %d\n", threadIdx.x, cIters);
cSteps += __shfl_xor_sync(0xffffffff, cSteps, 2, 32);
cIters += __shfl_xor_sync(0xffffffff, cIters, 2, 32);
printf(" 2: Th %2d cI %d\n", threadIdx.x, cIters);
cSteps += __shfl_xor_sync(0xffffffff, cSteps, 4, 32);
cIters += __shfl_xor_sync(0xffffffff, cIters, 4, 32);
printf(" 4: Th %2d cI %d\n", threadIdx.x, cIters);
cSteps += __shfl_xor_sync(0xffffffff, cSteps, 8, 32);
cIters += __shfl_xor_sync(0xffffffff, cIters, 8, 32);
printf(" 8: Th %2d cI %d\n", threadIdx.x, cIters);
cSteps += __shfl_xor_sync(0xffffffff, cSteps, 16, 32);
cIters += __shfl_xor_sync(0xffffffff, cIters, 16, 32);
printf("16: Th %2d cI %d\n", threadIdx.x, cIters);
}
int main()
{
test_kernel <<<1, 32>>> ();
return 0;
}
在 Debug模式下,随机播放按预期工作。我看到每个线程都以自己的值开始:
0: Th 0 cI 2
0: Th 1 cI 12
0: Th 2 cI 22
0: Th 3 cI 32
0: Th 4 cI 41
// ...
在第一次洗牌 xor 1 后,每对线程都同意相同的数字:
1: Th 0 cI 14
1: Th 1 cI 14
1: Th 2 cI 54
1: Th 3 cI 54
在 shuffle xor 2 之后,每组四个线程同意:
2: Th 0 cI 68
2: Th 1 cI 68
2: Th 2 cI 68
2: Th 3 cI 68
2: Th 4 cI 223
2: Th 5 cI 223
2: Th 6 cI 223
2: Th 7 cI 223
等等。在最后一次洗牌之后,warp 中的所有线程都同意相同的值 (4673)。
一旦我启用 Release模式,我得到的结果是微妙的垃圾。进入随机播放的值是相同的,第一轮随机播放后的值与调试版本一致(并且与之前一样在每一对内一致)。一旦我执行 shuffle xor 2,结果就会崩溃:
2: Th 0 cI 28
2: Th 1 cI 28
2: Th 2 cI 108
2: Th 3 cI 108
2: Th 4 cI 186
2: Th 5 cI 186
2: Th 6 cI 260
2: Th 7 cI 260
事实上,如果洗牌序列被这个特定损坏的序列替换,这就是调试构建(和手工检查)将产生的确切输出:
printf(" 0: Th %d cI %d\n", threadIdx.x, cIters);
__syncthreads();
cSteps += __shfl_xor_sync(0xffffffff, cSteps, 1, 32);
cIters += __shfl_xor_sync(0xffffffff, cIters, 1, 32);
printf(" 1: Th %2d cI %d\n", threadIdx.x, cIters);
cSteps += __shfl_xor_sync(0xffffffff, cSteps, 1, 32); // 2 changed to 1
cIters += __shfl_xor_sync(0xffffffff, cIters, 1, 32); // 2 changed to 1
printf(" 2: Th %2d cI %d\n", threadIdx.x, cIters);
cSteps += __shfl_xor_sync(0xffffffff, cSteps, 4, 32);
cIters += __shfl_xor_sync(0xffffffff, cIters, 4, 32);
printf(" 4: Th %2d cI %d\n", threadIdx.x, cIters);
cSteps += __shfl_xor_sync(0xffffffff, cSteps, 8, 32);
cIters += __shfl_xor_sync(0xffffffff, cIters, 8, 32);
printf(" 8: Th %2d cI %d\n", threadIdx.x, cIters);
cSteps += __shfl_xor_sync(0xffffffff, cSteps, 16, 32);
cIters += __shfl_xor_sync(0xffffffff, cIters, 16, 32);
输出的完整差异是 here .
软硬件环境如下:
GA103 3080Ti(移动),采用制造商推荐的时钟,16 G VRAM。机器似乎没有与其他 Cuda 程序损坏(使用 primegrid-CUDA 测试并根据双重检查验证任务)
CUDA 11.0
MVSC 主机编译器 14.29.30133
完整调试命令行如下:
"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0\bin\nvcc.exe" -gencode=arch=compute_52,code=\"sm_52,compute_52\" --use-local-env -ccbin "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\bin\HostX86\x64" -x cu -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0\include" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0\include" -G --keep-dir x64\Debug -maxrregcount=0 --machine 64 --compile -cudart static -g -DWIN32 -DWIN64 -D_DEBUG -D_CONSOLE -D_MBCS -Xcompiler "/EHsc /W3 /nologo /Od /Fdx64\Debug\vc142.pdb /FS /Zi /RTC1 /MDd " -o x64\Debug\kernel.cu.obj "C:\Users\[username]\source\repos\BugRepro\BugRepro\kernel.cu"
完整发布命令行如下:
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0\bin\nvcc.exe" -gencode=arch=compute_52,code=\"sm_52,compute_52\" --use-local-env -ccbin "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\bin\HostX86\x64" -x cu -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0\include" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0\include" --keep-dir x64\Release -maxrregcount=0 --machine 64 --compile -cudart static -DWIN32 -DWIN64 -DNDEBUG -D_CONSOLE -D_MBCS -Xcompiler "/EHsc /W3 /nologo /O2 /Fdx64\Release\vc142.pdb /FS /Zi /MD " -o x64\Release\kernel.cu.obj "C:\Users\[username]\source\repos\BugRepro\BugRepro\kernel.cu"
我尝试过但没有解决的事情:
让每个线程写入全局内存,然后在主机 CPU 上求和确实会产生正确的结果。
用调用 __shfl_sync
和手动计算的车道 ID 替换所有随机播放。 只是用__shfl_sync
替换损坏的shuffle xor 2 不会。用 __shfl_sync
替换 just 第一个 shuffle xor 1(它工作正常)确实似乎修复了它。 (这两个解决方法适用于我的 MVCE;我还没有机会评估它们是否适用于整个程序)
// unexpectedly working
int id = threadIdx.x;
printf(" 0: Th %d cI %d\n", threadIdx.x, cIters);
__syncthreads();
cSteps += __shfl_sync(0xffffffff, cSteps, id ^ 1, 32);
cIters += __shfl_sync(0xffffffff, cIters, id ^ 1, 32);
printf(" 1: Th %2d cI %d\n", threadIdx.x, cIters);
cSteps += __shfl_xor_sync(0xffffffff, cSteps, 2, 32);
cIters += __shfl_xor_sync(0xffffffff, cIters, 2, 32);
printf(" 2: Th %2d cI %d\n", threadIdx.x, cIters);
cSteps += __shfl_xor_sync(0xffffffff, cSteps, 4, 32);
cIters += __shfl_xor_sync(0xffffffff, cIters, 4, 32);
printf(" 4: Th %2d cI %d\n", threadIdx.x, cIters);
cSteps += __shfl_xor_sync(0xffffffff, cSteps, 8, 32);
cIters += __shfl_xor_sync(0xffffffff, cIters, 8, 32);
printf(" 8: Th %2d cI %d\n", threadIdx.x, cIters);
cSteps += __shfl_xor_sync(0xffffffff, cSteps, 16, 32);
cIters += __shfl_xor_sync(0xffffffff, cIters, 16, 32);
printf("16: Th %2d cI %d\n", threadIdx.x, cIters);
即使我有解决方法,我担心我仍然会在某处遇到未定义的行为,而且我的修复可能很脆弱。
任何人都可以阐明这一点吗?我的程序中确实有UB吗?这是一个已知的编译器错误吗?
最佳答案
根据 CUDA 工程团队,这已被确认为编译器错误。正如他们的来信所证实的那样,修复即将推出:
The fix is targeting a future major CUDA release after CUDA 11. The JIT fix will possibly be a little earlier in a Driver branch after latest R515 online.
编辑:似乎没有在 516.94 Game Ready 驱动程序中修复。它似乎在 522.25 和 Cuda 11.8 中得到修复。
他们还确认关闭优化可以解决问题;他们不会对任何在优化仍在进行中可靠工作的解决方法发表评论。
以下解决方法适用于我的硬件和编译器,但 YMMV:
__shfl_sync
而不是 shfl_add_sync
或 shfl_xor_sync
__reduce_add_sync
关于cuda - 为什么我的 CUDA warp shuffle sum 在一个洗牌步骤中使用了错误的偏移量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72906728/
我正在尝试复制以下 while 循环,但它们交错我的“卡片”的方式有所不同。 这是我当前有效的 while 循环,我的目标是重新创建此循环,但颠倒两个 card_force 数组的顺序: while
我有以下 Spark 作业,试图将所有内容保留在内存中: val myOutRDD = myInRDD.flatMap { fp => val tuple2List: ListBuffer[(St
我最近开始学习 tensorflow。 我不确定是否有区别 x = np.array([[1],[2],[3],[4],[5]]) dataset = tf.data.Dataset.from_ten
我想重置 pyspark 代码中的 spark.sql.shuffle.partitions 配置,因为我需要加入两个大表。但是以下代码在最新的spark版本中不起作用,错误说“xxx中没有方法“se
我只是想验证我对这些参数及其关系的理解,如果我错了请通知我。 mapreduce.reduce.shuffle.input.buffer.percent 告诉分配给 reducer 的整个洗牌阶段的内
假设我的数据库中有 10 个项目正在尝试洗牌,我如何更改当前的代码,以便每次从数据库中提取一个名称时,一次显示一个名称,而不是全部显示一次? $con = mysqli_connect("XXX",
1.概述 转载:Flink Remote Shuffle 开源:面向流批一体与云原生的 Shuffle 服务 2.开源 作为支持 Flink 流批一体与云原生的重要组成部分,Flink Remote
这个 fiddle 演示了我的问题:https://jsfiddle.net/petebere/fhg84je2/ 我想确保每次用户单击按钮时都会显示数组中的随机元素。问题是,有时进行新的混洗时,新混
对于那些了解情况的人来说,这应该是一个足够简单的问题 - 为什么我会在控制台中收到此错误?我尝试按照 Shuffle homepage 上“用法”下显示的代码进行操作但我认为该页面忽略了包含开始使用该
在下面的 Spark admin 在端口 8080 上运行的屏幕截图中: 此代码的“随机读取”和“随机写入”参数始终为空: import org.apache.spark.SparkContext;
docs说“所有排列的发生概率大致相等。”但我不知道这是否包括返回相同订单的可能性(无论多么小)。我有一个方法(见下文),在两次测试运行期间,列表以原始顺序返回,也许……其他因素可能有问题,比如可能已
我有一份处理大量数据的工作。此作业经常运行而没有任何错误,但偶尔会引发此错误。我正在使用 Kyro Serializer。 我正在使用 yarn 集群运行 Spark 1.2.0。 完整的堆栈跟踪在这
我正在 EC2 集群上部署 Spark 数据处理作业,该作业对于集群来说很小(16 个核心,总共 120G RAM),最大的 RDD 只有 76k+ 行。但是中间严重倾斜(因此需要重新分区)并且每
打乱数据的 spark sql 聚合操作,即 spark.sql.shuffle.partitions 200(默认情况下)。当 shuffle partition 大于 200 时,性能会发生什么变
打乱数据的 spark sql 聚合操作,即 spark.sql.shuffle.partitions 200(默认情况下)。当 shuffle partition 大于 200 时,性能会发生什么变
当在 Python 3 中使用 random 模块 random.shuffle(list(range(n))) 时,但是 random.shuffle(range( n)) 没有。 为什么会这样?
当我尝试在 pycaret 中训练某些东西时,我收到此错误消息 ValueError: Setting a random_state has no effect since shuffle is Fa
我正在以推测模式运行 Spark 作业。我有大约 500 个任务和大约 500 个 1 GB gz 压缩文件。我不断地进入每项作业,对于 1-2 个任务,附加错误,然后它会重新运行数十次(阻止作业完成
作为Django中关键字云函数的一部分,我正在尝试输出字符串列表。是否有模板过滤器,可让您随机播放列表中的项目?我认为这很简单,但是我在官方文档中找不到任何适用的过滤器。 最佳答案 制作自己的东西很简
同时思考this问题并与参与者交谈后,出现了这样的想法:对一组有限的明显有偏见的随机数进行洗牌,使它们变得随机,因为你不知道它们被选择的顺序。这是真的吗?如果是的话,有人可以指出一些资源吗? 编辑:我
我是一名优秀的程序员,十分优秀!