У меня есть следующий код ядра 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, рассчитанное на графическом процессоре, имеет точность до 9 десятичные знаки:
Код: Выделить всё
CPU A = 5.27261255 7671862987e-08
NV A = 5.27261255 9188061227e-08
Код: Выделить всё
A_h1
Код: Выделить всё
CPU A = 5.272612557671862987e-08
NV A = 5.272612557671862987e-08
Код: Выделить всё
CUDA 12.4
Также отмечу, что видел советы типа использования флага компиляции --fmad=false, однако в OpenCL такого флага нет спецификации.
Большое спасибо за помощь!
Подробнее здесь: https://stackoverflow.com/questions/783 ... ncl-kernel