Непредсказуемые изменения точности вычислений в ядре OpenCL.C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Непредсказуемые изменения точности вычислений в ядре OpenCL.

Сообщение Anonymous »

Добрый день всем!
У меня есть следующий код ядра OpenCL:

Код: Выделить всё

double calcA(double2 point1, double2 point2);

void __kernel mainProgram()
{
long long index = get_global_id(0);

if (index == 0)
{
double2 p1   = (double2)(0.891949793450334649, 0.513485940430910115);
double2 p2   = (double2)(0.891949846176460226, 0.513485940430959964);

double dist = calcA(p1, p2);

printf("NV A        = %.18e\n", dist);
}
}

double calcA(double2 p1, double2 p2)
{
double cos1 = cos(p1[0]);
double cos2 = cos(p2[0]);
double sin1 = sin(p1[0]);
double sin2 = sin(p2[0]);
double cosDelta = cos(p2[1] - p1[1]);

double A_h1 = cos1 * sin2;
double A_h2 = sin1 * cos2 * cosDelta;
double A = A_h1 - A_h2;

// printf("NV A_h1     = %.18e\n", A_h1);

return A;
}
Это часть гораздо более обширного кода, который просто демонстрирует основную проблему. В этом коде, как видите, внутри центральной функции ядра вызывается локальная функция, которая вычисляет некоторое значение A (за три шага) и выводит его на экран.
В хост-программе , те же вычисления выполняются параллельно и выводятся на экран для сравнения полученных значений.
Проблема в том, что значение A, рассчитанное на графическом процессоре, имеет точность до 9 десятичные знаки:

Код: Выделить всё

CPU A = 5.27261255 7671862987e-08
NV  A = 5.27261255 9188061227e-08
Однако если одна из промежуточных переменных ( или A_h2) печатается в функции CalcD (например, раскомментировав строку), затем графический процессор начинает выводить абсолютно правильное значение A:

Код: Выделить всё

CPU A = 5.272612557671862987e-08
NV  A = 5.272612557671862987e-08
Отмечу, что я использую библиотеку напрямую, выполняя вычисления на RTX 4080 (

Код: Выделить всё

CUDA 12.4
, драйвера 551.78).
Также отмечу, что видел советы типа использования флага компиляции --fmad=false, однако в OpenCL такого флага нет спецификации.
Большое спасибо за помощь!

Подробнее здесь: https://stackoverflow.com/questions/783 ... ncl-kernel
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как использовать OpenCl C ++/C ++ для языков ядра OpenCl?
    Anonymous » » в форуме C++
    0 Ответы
    4 Просмотры
    Последнее сообщение Anonymous
  • Проблема с использованием printf в ядре OpenCL
    Гость » » в форуме C++
    0 Ответы
    51 Просмотры
    Последнее сообщение Гость
  • Cupy - Проблема с текстурами для вычислений двойной точности.
    Anonymous » » в форуме Python
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous
  • Cupy - Проблема с текстурами для вычислений двойной точности.
    Anonymous » » в форуме Python
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Предупреждение о точности вычислений при использовании GridSearchCV для логистической регрессии
    Anonymous » » в форуме Python
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»