有人可以对此发表评论,
我想做一个矢量点积。我的浮点矢量是[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];
}
我的内核的全长(52个元素)的结果总和为234038032,而matlab的结果为234038038。对于产品的1到9个元素总和,我的内核结果与matlab结果一致。对于10个元素的总和,它偏离1并逐渐增加。结果是可重复的。我检查了所有元素,发现没有问题。
答案 0 :(得分:11)
由于向量是浮动的,因此您遇到舍入错误。 Matlab将以更高的精度(双倍)存储所有内容,因此不会那么早地看到舍入错误。
你可能想看看David Goldberg的What Every Computer Scientist Should Know About Floating Point - 非常宝贵的阅读。
C ++中的简单演示(即与CUDA无关):
#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
那么你能做些什么呢?你可以进入几个方向......