C++ 浮点精度
有人能对此发表评论吗? 我想做一个向量点积。我的浮点向量是[2080:2131]和[2112:2163],每一个都包含52个元素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
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示例中的技术
- 用法:非常直截了当
C++中的简单演示(即与CUDA无关):
那么你能做些什么呢?你可以朝几个方向走- 使用更高的精度:这将影响性能,并且并非所有设备都支持双精度。它也只是推迟了问题,而不是解决它,所以我不推荐它李>
- 执行基于树的缩减:您可以结合vectorAdd和Reduce SDK示例中的技术
- 用法:非常直截了当
#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