точность с плавающей запятой - PullRequest
1 голос
/ 05 ноября 2010

Может кто-нибудь прокомментировать это,

Я хочу создать векторное произведение точек. Мой вектор с плавающей точкой - [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 и постепенно увеличивается. Результаты были воспроизводимы. Я проверил все элементы и не нашел проблем.

1 Ответ

11 голосов
/ 05 ноября 2010

Поскольку векторы являются плавающими, у вас возникают ошибки округления.Matlab будет хранить все с гораздо более высокой точностью (двойной) и, следовательно, не увидит ошибок округления так рано.

Возможно, вы захотите проверить Что должен знать каждый учёный-компьютерщик с плавающей запятой Дэвид Голдберг - бесценное чтение.

Простая демонстрация на 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

Так что вы можете с этим поделать?Вы можете пойти в нескольких направлениях ...

  • Используйте более высокую точность: это повлияет на производительность, и не все устройства поддерживают двойную точность.Это также просто откладывает проблему, а не исправляет ее, поэтому я бы не рекомендовал ее!
  • Делать редукцию на основе дерева: вы можете комбинировать приемы в выборках vectorAdd и Reduction SDK.
  • Использовать Тяга : очень прямолинейная.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...