You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenCL内核计算精度出现不可预测变化的技术求助

OpenCL内核精度异常问题

我有一段从大型代码中提取的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值并打印,主机端并行执行相同计算作对比:

  • 默认情况下,GPU计算的A值仅精确到9位小数,与CPU结果存在差异:
CPU A = 5.27261255 7671862987e-08
NV  A = 5.27261255 9188061227e-08
  • 若取消calcA函数中中间变量(如A_h1)的打印注释,GPU会输出与CPU完全一致的精确结果:
CPU A = 5.272612557671862987e-08
NV  A = 5.272612557671862987e-08

环境信息

  • 使用<CL/opengl.hpp>库
  • 硬件:RTX 4080
  • 软件:CUDA 12.4,驱动551.78

已尝试的解决方法

  • 尝试使用--fmad=false编译标志,但该标志不属于OpenCL规范,无效
  • 按建议使用-cl-opt-disable标志,仅在本测试示例中有效,但在主程序中仅略微改变不精确值,未达到预期精度

内容的提问来源于stack exchange,提问作者Roman Zuev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 00:37:39