如何找到 CUDA 的 epsilon、min 和 max 常量?

2023-12-24

我正在寻找 CUDA 设备的 epsilon(两个数字之间的最小步长)、min(最小量值)和 max(最大量值)的值。

即 FLT_EPSILON (DBL_EPSILON)、FLT_MIN (DBL_MIN) 和 FLT_MAX (DBL_MAX) 中定义的等效项<float.h>在 gcc 编译器中。

某些 CUDA 包含文件中是否有常量? 有什么手册解释一下吗?有什么方法可以编写内核来计算它们吗?

提前致谢。


是的,如果您愿意,您当然可以自己计算这些。 Acouple http://en.wikipedia.org/wiki/Machine_epsilon#How_to_determine_machine_epsilon examples http://en.wikipedia.org/wiki/Machine_epsilon#Approximation_using_C维基百科页面上的 C 语言给出了如何计算机器 epsilon 的信息;类似地,您可以通过除/乘以二来找到最小值/最大值,直到低于/溢出。 (然后,您应该在最后一个有效值和下一个二分之一之间进行搜索,以找到“真实”最小/最大值,但这为您提供了一个很好的起点)。

不过,如果您的设备的计算能力为 2.0 或更高,那么数学主要是 IEEE 754,有一些小偏差(例如,并非支持所有舍入模式),但这些偏差不足以影响像这样的基本数值常数;所以你会得到 5.96e-08 的单倍和 1.11e-16 的双倍的标准 emac; FLT_MIN/MAX 为 1.175494351e-38/3.402823466e+38,DBL_MIN/MAX 为 2.2250738585072014e-308/1.7976931348623158e+308。

在计算能力 1.3 的计算机上,单精度不支持非规范化数字,因此您的 FLT_MIN 将明显大于 CPU 上的数字。

在计算能力 2.0 机器上进行快速测试,对最小值/最大值进行快速而肮脏的计算:

#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
#include <cuda.h>
#include <sys/time.h>
#include <math.h>
#include <assert.h>
#include <float.h>

#define CHK_CUDA(e) {if (e != cudaSuccess) {fprintf(stderr,"Error: %s\n", cudaGetErrorString(e)); exit(-1);}}

/* from wikipedia page, for machine epsilon calculation */
/* assumes mantissa in final bits */
__device__ double machine_eps_dbl() {
    typedef union {
        long long i64;
        double d64;
    } dbl_64;

    dbl_64 s;

    s.d64 = 1.;
    s.i64++;
    return (s.d64 - 1.);
}

__device__ float machine_eps_flt() {
    typedef union {
        int i32;
        float f32;
    } flt_32;

    flt_32 s;

    s.f32 = 1.;
    s.i32++;
    return (s.f32 - 1.);
}

#define EPS 0
#define MIN 1
#define MAX 2

__global__ void calc_consts(float *fvals, double *dvals) {

    int i = threadIdx.x + blockIdx.x*blockDim.x;
    if (i==0) {
        fvals[EPS] = machine_eps_flt();
        dvals[EPS]= machine_eps_dbl();

        float xf, oldxf;
        double xd, oldxd; 

        xf = 2.; oldxf = 1.;
        xd = 2.; oldxd = 1.;

        /* double until overflow */
        /* Note that real fmax is somewhere between xf and oldxf */
        while (!isinf(xf))  {
            oldxf *= 2.;
            xf *= 2.;
        }

        while (!isinf(xd))  {
            oldxd *= 2.;
            xd *= 2.;
        }

        dvals[MAX] = oldxd;
        fvals[MAX] = oldxf;

        /* half until overflow */
        /* Note that real fmin is somewhere between xf and oldxf */
        xf = 1.; oldxf = 2.;
        xd = 1.; oldxd = 2.;

        while (xf != 0.)  {
            oldxf /= 2.;
            xf /= 2.;
        }

        while (xd != 0.)  {
            oldxd /= 2.;
            xd /= 2.;
        }

        dvals[MIN] = oldxd;
        fvals[MIN] = oldxf;

    }
    return;
}

int main(int argc, char **argv) {
    float  fvals[3];
    double dvals[3];
    float  *fvals_d;
    double *dvals_d;

    CHK_CUDA( cudaMalloc(&fvals_d, 3*sizeof(float)) );
    CHK_CUDA( cudaMalloc(&dvals_d, 3*sizeof(double)) );

    calc_consts<<<1,32>>>(fvals_d, dvals_d);

    CHK_CUDA( cudaMemcpy(fvals, fvals_d, 3*sizeof(float), cudaMemcpyDeviceToHost) );
    CHK_CUDA( cudaMemcpy(dvals, dvals_d, 3*sizeof(double), cudaMemcpyDeviceToHost) );

    CHK_CUDA( cudaFree(fvals_d) );
    CHK_CUDA( cudaFree(dvals_d) );

    printf("Single machine epsilon:\n");
    printf("CUDA = %g, CPU = %g\n", fvals[EPS], FLT_EPSILON);
    printf("Single min value (CUDA - approx):\n");
    printf("CUDA = %g, CPU = %g\n", fvals[MIN], FLT_MIN);
    printf("Single max value (CUDA - approx):\n");
    printf("CUDA = %g, CPU = %g\n", fvals[MAX], FLT_MAX);

    printf("\nDouble machine epsilon:\n");
    printf("CUDA = %lg, CPU = %lg\n", dvals[EPS], DBL_EPSILON);
    printf("Double min value (CUDA - approx):\n");
    printf("CUDA = %lg, CPU = %lg\n", dvals[MIN], DBL_MIN);
    printf("Double max value (CUDA - approx):\n");
    printf("CUDA = %lg, CPU = %lg\n", dvals[MAX], DBL_MAX);

    return 0;
}

编译/运行显示答案与 CPU 版本一致(最小值除外;FLT_MIN 是否给出了最小正常值而不是在 CPU 上进行了标准化?)

$ nvcc -o foo foo.cu -arch=sm_20
$ ./foo
Single machine epsilon:
CUDA = 1.19209e-07, CPU = 1.19209e-07
Single min value (CUDA - approx):
CUDA = 1.4013e-45, CPU = 1.17549e-38
Single max value (CUDA - approx):
CUDA = 1.70141e+38, CPU = 3.40282e+38

Double machine epsilon:
CUDA = 2.22045e-16, CPU = 2.22045e-16
Double min value (CUDA - approx):
CUDA = 4.94066e-324, CPU = 2.22507e-308
Double max value (CUDA - approx):
CUDA = 8.98847e+307, CPU = 1.79769e+308
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何找到 CUDA 的 epsilon、min 和 max 常量? 的相关文章

  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • 需要 TensorFlow 依赖项。如何在 Windows 上运行 TensorFlow

    我有兴趣让 TensorFlow 在 Windows 上运行 但目前我意识到这是不可能的 因为某些依赖项无法在 Windows 上使用 例如巴泽尔 之所以出现这种需求 是因为据我目前了解 从 TensorFlow 访问 GPU 的唯一方法是
  • 为什么 isnormal() 说一个值是正常的,而实际上不是?

    include
  • Java Double 对象存储到小数点后两位[重复]

    这个问题在这里已经有答案了 是否可以将 java lang Double 存储到正好两位小数 前任 0 2变成0 20 我将代码修改为以下 Double correlation getSomeDoubleValue label key da
  • nvidia GPU 上的内核真的有超时吗?

    寻找为什么我的内核产生奇怪的错误消息或仅 0 结果的答案我发现了这个answer https stackoverflow com questions 3988645 cl out of resources for 2 millions fl
  • 用于验证目的的动态查找方法

    我正在使用 Ruby on Rails 3 0 7 我想在运行时查找一些记录以进行验证 但为该查找方法传递 设置一个值 也就是说 在我的班级中 我有以下内容 class Group lt lt ActiveRecord Base valid
  • 浮点运算的最佳实践

    我正在对精确到小数点后第二位的小数输入执行加法和减法 我试图通过乘以 100 将它们转换为整数来提高准确性 但效果却相反 考虑以下代码和输出 double d 2 01 int a int d 100 0 cout lt lt a lt l
  • Google Colab 显示忙碌

    我昨天在 google colab 上进行了训练过程 现在 即使重新启动运行时并中断执行后 Google Colab仍显示繁忙 我想停止当前的执行 请帮忙 从运行时菜单中选择 重新启动运行时 就足够了 如果由于某种原因不起作用 您可以通过从
  • 将浮点值转换为灰度十六进制颜色值

    这个问题又快又简单 我有一个二维浮点数组 0 0000000 到 1 0000000 我想将这些数字转换为颜色值 000000 到 ffffff 请注意 我所说的只是灰度值 0 黑色 0 5 中灰色 1 白色 有谁知道如何用 javascr
  • 为什么 CUDA 内存复制速度会这样,有一些恒定的驱动程序开销?

    在我的旧 GeForce 8800GT 上使用 CUDA 内存时 我总是会遇到奇怪的 0 04 毫秒开销 我需要将 1 2K 传输到设备的常量内存中 处理其中的数据并从设备中仅获取一个浮点值 我有一个使用 GPU 计算的典型代码 alloc
  • iPhone 上的双精度与浮动

    我刚刚听说 iPhone 本身无法进行双倍操作 从而使它们比常规浮动慢得多 这是真的 证据 我对这个问题很感兴趣 因为我的程序需要高精度计算 而且我将不得不在速度上妥协 iPhone 可以在硬件中执行单精度和双精度算术 在 1176 原始
  • 求不同数量的双打中的平均值

    我有一个双精度数组列表 我需要找到所有数字之间的平均值 arraylist 中 Double 实例的数量不是恒定的 可能是 2 也可能是 90 我已经尝试了几个小时来自己获取算法 但无论如何都无法让它工作 你有什么建议吗 或者也许你可以将我
  • 如何将双精度/浮点四舍五入为二进制精度?

    我正在编写对浮点数执行计算的代码的测试 不出所料 结果很少是准确的 我想在计算结果和预期结果之间设置一个容差 我已经证实 在实践中 使用双精度 在对最后两位有效小数进行四舍五入后 结果始终是正确的 但是usually四舍五入最后一位小数后
  • 使用C标准数学库精确计算标准正态分布的PDF

    The probability density function of the standard normal distribution is defined as e x2 2 2 This can be rendered in stra
  • 嵌套循环中数组的二维累积和——CUDA实现?

    我一直在考虑如何使用归约在 CUDA 上执行此操作 但我对如何完成它有点不知所措 C 代码如下 要记住的重要部分 变量预先计算的值依赖于取决于both循环迭代器 另外 变量ngo并不是每个值都是唯一的m 例如m 0 1 2 可能有ngo 1
  • Dart tryParse double 与 double 字符串

    似乎与 Dart 中使用 tryParse 的方式有些不一致 或者我正在以一种愚蠢的方式处理它 很可能是后者 当我们使用 int tryParse 语句时 如果我们将 10 0 作为双精度值传递给它 我们将期望得到 10 print int
  • 使用 3D 加速进行图形渲染

    我们为巨大的数据集生成图表 我们谈论的是每秒 4096 个样本 每张图 10 分钟 简单计算得出 每个线图有 4096 60 10 2457600 个样本 每个样本都是双精度 8 字节 精度 FP 此外 我们在一个屏幕上渲染多个线图 最多可
  • 针对 openpose 将 GCC 9.3.0 降级到 7 后,cuda_compile_1_ generated_batch_norm_layer.cu.o.Release.cmake 出现 CMake 错误

    你知道我该如何解决以下错误吗 这是在我使用以下命令从 GCC 9 3 0 降级到 7 后发生的 使用以前版本的 GCC 我收到此错误 CMake 不支持的 GNU 版本 不支持高于 8 的 gcc 版本 https stackoverflo
  • 两个浮点数相加

    我想计算两个 IEEE 754 二进制 64 数字的四舍五入之和 为此我编写了下面的 C99 程序 include
  • Python 中的十进制到二进制半精度 IEEE 754

    我只能使用以下命令将十进制转换为二进制单精度 IEEE754struct pack模块 或者使用相反的方法 float16 或 float32 numpy frombuffer 是否可以使用 Numpy 将十进制转换为二进制半精度浮点数 我

随机推荐

  • 如何更改 TemplateField 中 ItemTemplate 的命令文本和图像按钮

    我有一个带有 ImageButton 的列 我的数据库字段有bit数据类型 我希望我的记录在该列中具有真正的价值True jpg我的命令变成MakeFalse当它有错误值时显示False jpg我的命令变成MakeTrue 我怎样才能做到这
  • 如何在AS3中发送GET请求?

    我在这里看到这个例子 http damn ihateblue net 2011 09 24 actionscript 3 send getpost http damn ihateblue net 2011 09 24 actionscrip
  • 防止 Javascript 转义文本?

    声明 text section main 结果是 节 主 有没有办法阻止 Javascript 解释器将反斜杠视为转义字符并将其删除 我希望能够声明 section main 并在输出中保留反斜杠 节 main 注意 我意识到如果我使用两个
  • JNI 中 jclass 的类名

    这可能是一个愚蠢的问题 暴露出对 JNI 缺乏理解 我正在编写一个封装 Java VM 的 C 程序 我使用 CallVoidMethod 等调用来调用 VM 内的函数 这纯粹是背景知识 与问题不太相关 我希望能够找到给定 jclass 实
  • Struts2 排除模式不起作用

    我正在将 struts2 用于基于 GAE 的应用程序 我有一个 servlet 来上传这样的文件 Override protected void doPost HttpServletRequest req HttpServletRespo
  • 如何在Amazon Linux系统中升级ruby版本?

    我使用 padrino ruby 框架开发了 ruby 应用程序 我想将其部署在亚马逊上 我用了这张图片 Amazon Linux AMI 2017 09 1 HVM SSD 卷类型 图像描述是 Amazon Linux AMI 是一个由
  • AWS Lambda:创建触发器

    当我尝试添加触发器时 出现以下错误 创建触发器时出错 配置定义不明确 如果同一事件类型的前缀重叠 则两个规则中不能有重叠的后缀 我不确定这里出了什么问题 原因之一可能是之前使用相同触发器的其他某个 lambda 函数已被删除 这不会自动清除
  • 提交时合并两个表单中的值

    我在一个 html 页面上有两个表单 使用 jQuery 是否可以在提交第一个表单时将两个表单中的数据放入 POST 数据中 jQuery序列化支持多个表单元素 所以可以这样做 form1 form2 serialize 对于你的情况 你可
  • ElasticSearch PutMapping API:MapperParsingException 解析后根类型映射不为空

    我的本地实例上有一个 River ES 1 3 4 和 JDBC For MySql 1 3 4 4 这条河运行良好 并在 ES 中导入数据 我面临的问题是我的字段之一是文本字段并且其中有空格 例如 实时计算器 ES 将其索引为 实时 时间
  • 如何在不使用 IDE 且不了解程序流程的情况下调试应用程序?

    我正在尝试修改优秀书籍提供的朴素贝叶斯分类器的代码集体智慧编程 https rads stackoverflow com amzn click com 0596529325 使其适应 GAE 数据存储 提供的代码使用 pysqlite2 但
  • django 1.3+ 的简单日志到文件示例

    发行说明说 Django 1 3 添加了框架级别 支持 Python 的日志记录模块 那很好 我想利用这一点 很遗憾文档 http docs djangoproject com en 1 11 topics logging 并没有以完整的工
  • 将图标放置在 div 的右上角

    我创建了这段代码 但我无法将图标放在 valori 类的 div 的右上角 这里是期望的结果 这里的代码 HTML div class circletop div class numberpr 3 anno div div class lo
  • 运行 Firebase 模拟器时出现“确定执行环境时出现意外错误”

    当我部署函数时 一切正常 但使用 Firebase 模拟器在本地运行相同的代码会出现以下错误 message Unexpected error determining execution environment request to htt
  • 表单提交复选框将值设置为“on”而不是“true”

    您好 我有一个 html 表单 我通过按钮上的单击事件提交该表单 该事件触发 myform submit 问题是表单上有一个复选框 并且在发布的参数下的 firebug 中它显示 mycheckbox1 on 而不是预期的 mycheckb
  • 在嵌套元组中查找值

    假设我有 t dog Dog cat Cat fish Fish 我需要检查一个值是否位于嵌套元组的第一位 即小写位 中 我怎样才能做到这一点 大写值实际上并不重要 我只想搜索仅包含小写值的字符串 if fish in t print Fi
  • jspdf AutoTable :表格特定行的目标样式

    我正在为我的表格 pdf 使用 jsPDF AutoTable 插件 我的资料来源 javaScriptIncludeTag jspdf min js javaScriptIncludeTag jspdf plugin autotable
  • 类 CharField() 的参数

    有什么区别CharField name max length 100 and CharField max length 100 参数是什么 name 用于 什么是CharField 构造函数 有人可以给我一个链接吗 CharField 继承
  • 保持geom_rect半透明区域,但彩色轮廓

    我正在尝试使用 R 中的plotly 创建一个带有矩形的交互式绘图 我的主要想法正在发挥作用 然而 我所坚持的是允许每个矩形都有一个彩色轮廓 如数据的 填充 列中所描绘的 但是是一个完全透明的区域 以下是正在运行的 MWE library
  • 收款人不接受以该货币付款

    我正在尝试执行链式付款 其中主要收款人采用英镑 GBP 货币 我是交易的第二接收者 我的帐户设置为美元 但不阻止任何货币 如您所见 以下是确切的错误消息 接收方 不接受此货币的付款 请帮助我理解为什么会失败 我的帐户需要进行其他设置吗 我必
  • 如何找到 CUDA 的 epsilon、min 和 max 常量?

    我正在寻找 CUDA 设备的 epsilon 两个数字之间的最小步长 min 最小量值 和 max 最大量值 的值 即 FLT EPSILON DBL EPSILON FLT MIN DBL MIN 和 FLT MAX DBL MAX 中定