大浮点数的OpenCL还原结果错误

大浮点数的OpenCL还原结果错误,opencl,gpu,reduction,Opencl,Gpu,Reduction,我曾经使用浮点精度计算0到65536之间所有数字的总和。不幸的是,结果并不正确。但是,当我修改代码,以便计算65536个较小数字的和(例如1)时,结果是正确的 我在代码中找不到任何错误。是否有可能因为浮点类型而得到错误的结果?如果是这种情况,解决问题的最佳方法是什么?这是使用有限精度CPU或GPU对浮点数求和的“副作用”。精度取决于算法和值的求和顺序。Higham的论文Nicholas J解释了背后的理论和实践 浮点求和的精度 解决方法是使用一种更智能的算法,如卡汉求和算法 海厄姆的报纸也有

我曾经使用浮点精度计算0到65536之间所有数字的总和。不幸的是,结果并不正确。但是,当我修改代码,以便计算65536个较小数字的和(例如1)时,结果是正确的

我在代码中找不到任何错误。是否有可能因为浮点类型而得到错误的结果?如果是这种情况,解决问题的最佳方法是什么?

这是使用有限精度CPU或GPU对浮点数求和的“副作用”。精度取决于算法和值的求和顺序。Higham的论文Nicholas J解释了背后的理论和实践

浮点求和的精度

解决方法是使用一种更智能的算法,如卡汉求和算法

海厄姆的报纸也有一些选择

这个问题说明了基准测试的本质,基准测试的第一条规则是获取 正确答案,使用真实数据

这是使用有限精度CPU或GPU对浮点数求和的“副作用”。精度取决于算法和值的求和顺序。Higham的论文Nicholas J解释了背后的理论和实践

浮点求和的精度

解决方法是使用一种更智能的算法,如卡汉求和算法

海厄姆的报纸也有一些选择

这个问题说明了基准测试的本质,基准测试的第一条规则是获取 正确答案,使用真实数据

这是使用有限精度CPU或GPU对浮点数求和的“副作用”。精度取决于算法和值的求和顺序。Higham的论文Nicholas J解释了背后的理论和实践

浮点求和的精度

解决方法是使用一种更智能的算法,如卡汉求和算法

海厄姆的报纸也有一些选择

这个问题说明了基准测试的本质,基准测试的第一条规则是获取 正确答案,使用真实数据

这是使用有限精度CPU或GPU对浮点数求和的“副作用”。精度取决于算法和值的求和顺序。Higham的论文Nicholas J解释了背后的理论和实践

浮点求和的精度

解决方法是使用一种更智能的算法,如卡汉求和算法

海厄姆的报纸也有一些选择

这个问题说明了基准测试的本质,基准测试的第一条规则是获取
正确答案,使用真实数据

内核或主机应用程序的编码可能没有错误。问题在于单精度浮点

正确的和是:65537*32768=2147516416,用31位二进制表示(1000000000000010000000000000)。32位浮点数只能精确地保存最大为2^24的整数

“绝对值小于[2^24]的任何整数都可以用单精度格式精确表示”

这就是为什么当总和小于或等于2^24时,您会得到正确的总和。如果使用单精度进行完全求和,那么无论在哪个设备上执行内核,最终都会失去精度。要得到正确答案,您可以做以下几件事:

  • 如果您的平台支持,请使用double而不是float
  • 使用整型或无符号整型
  • 将一组较小的数字相加,例如:0+1+2+…+4095+4096=(2^23+2^11)

内核或主机应用程序的编码可能没有错误。问题在于单精度浮点

正确的和是:65537*32768=2147516416,用31位二进制表示(1000000000000010000000000000)。32位浮点数只能精确地保存最大为2^24的整数

“绝对值小于[2^24]的任何整数都可以用单精度格式精确表示”

这就是为什么当总和小于或等于2^24时,您会得到正确的总和。如果使用单精度进行完全求和,那么无论在哪个设备上执行内核,最终都会失去精度。要得到正确答案,您可以做以下几件事:

  • 如果您的平台支持,请使用double而不是float
  • 使用整型或无符号整型
  • 将一组较小的数字相加,例如:0+1+2+…+4095+4096=(2^23+2^11)

内核或主机应用程序的编码可能没有错误。问题在于单精度浮点

正确的和是:65537*32768=2147516416,用31位二进制表示(1000000000000010000000000000)。32位浮点数只能精确地保存最大为2^24的整数

“绝对值小于[2^24]的任何整数都可以用单精度格式精确表示”

这就是为什么当总和小于或等于2^24时,您会得到正确的总和。如果使用单精度进行完全求和,那么无论在哪个设备上执行内核,最终都会失去精度。要得到正确答案,您可以做以下几件事:

  • 如果您的平台支持,请使用double而不是float
  • 使用整型或无符号整型
  • 将一组较小的数字相加,例如:0+1+2+…+4095+4096=(2^23+2^11)

内核或主机应用程序的编码可能没有错误。问题在于单精度浮点

正确的和是:65537*32768=2147516416,它需要31位以二进制(10000000000000100000000000)表示