Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 浮点精度_C++_C_Cuda - Fatal编程技术网

C++ 浮点精度

C++ 浮点精度,c++,c,cuda,C++,C,Cuda,有人能对此发表评论吗? 我想做一个向量点积。我的浮点向量是[2080:2131]和[2112:2163],每一个都包含52个元素 a[52] = {2080 2081 2082 ... ... 2129 2130 2131}; b[52] = {2112 2113 2114 ... ... 2161 2162 2163}; for (int i = 0; i < 52; i++) { sum += a[i]*b[i]; } a[52]={208020812082……212921

有人能对此发表评论吗?

我想做一个向量点积。我的浮点向量是[2080:2131]和[2112:2163],每一个都包含52个元素

a[52] = {2080 2081 2082 ... ... 2129 2130 2131};
b[52] = {2112 2113 2114 ... ... 2161 2162 2163};

for (int i = 0; i < 52; i++)
{
    sum += a[i]*b[i];
}
a[52]={208020812082……212921302131};
b[52]={2112213214……216121622163};
对于(int i=0;i<52;i++)
{
总和+=a[i]*b[i];
}

我的内核对整个长度(52个元素)的结果和是234038032,而matlab给出了234038038。对于积的1到9个元素和,我的核结果与matlab的结果一致。对于10元素和,它被关闭1并逐渐增加。结果是可重复的。我检查了所有的元素,没有发现任何问题

由于向量是浮动的,因此您遇到舍入错误。Matlab将以更高的精度(双精度)存储所有内容,因此不会过早地看到舍入误差

你可能想看看大卫·戈德伯格的《无价阅读》

C++中的简单演示(即与CUDA无关):

那么你能做些什么呢?你可以朝几个方向走

  • 使用更高的精度:这将影响性能,并且并非所有设备都支持双精度。它也只是推迟了问题,而不是解决它,所以我不推荐它
  • 执行基于树的缩减:您可以结合vectorAdd和Reduce SDK示例中的技术
  • 用法:非常直截了当

由于向量是浮动的,因此您遇到舍入错误。Matlab将以更高的精度(双精度)存储所有内容,因此不会过早地看到舍入误差

你可能想看看大卫·戈德伯格的《无价阅读》

C++中的简单演示(即与CUDA无关):

那么你能做些什么呢?你可以朝几个方向走

  • 使用更高的精度:这将影响性能,并且并非所有设备都支持双精度。它也只是推迟了问题,而不是解决它,所以我不推荐它
  • 执行基于树的缩减:您可以结合vectorAdd和Reduce SDK示例中的技术
  • 用法:非常直截了当

我真的无法理解您的问题,请您澄清并发布您的代码好吗?通常您应该发布内核代码和用于启动内核的代码,而不要看到更多代码。我担心您可能在一个CUDA线程中完成所有工作!无论如何,在这种情况下,问题显然是四舍五入。像这样的点积计算在使用有限精度时很容易出现数值问题。请记住,浮点只有24位精度,或大约6位十进制数字。我不能真正理解你的问题,请你澄清并发布你的代码好吗?通常你应该发布内核代码和你用来启动内核的代码,没有看到更多的代码,我担心你可能会在一个单一的CUDA线程中完成所有的工作!无论如何,在这种情况下,问题显然是四舍五入。像这样的点积计算在使用有限精度时很容易出现数值问题。请记住,浮点只有24位精度,或大约6位十进制数字。
#include <iostream>

int main(void)
{
  float a[52];
  float b[52];
  double c[52];
  double d[52];

  for (int i = 0 ; i < 52 ; i++)
  {
    a[i] = (float)(2080 + i);
    b[i] = (float)(2112 + i);
    c[i] = (double)(2080 + i);
    d[i] = (double)(2112 + i);
  }

  float fsum = 0.0f;
  double dsum = 0.0;
  for (int i = 0 ; i < 52 ; i++)
  {
    fsum += a[i]*b[i];
    dsum += c[i]*d[i];
  }

  std::cout.precision(20);
  std::cout << fsum << " " << dsum << std::endl;
}
234038032 234038038