【问题标题】:Intrinsics equivalent to the CUDA Type Casting Intrinsics __double2loint, __double2hiint and __hiloint2double内部等效于 CUDA 类型铸造内部 __double2loint、__double2hiint 和 __hiloint2double
【发布时间】:2017-08-08 23:07:45
【问题描述】:

我试图弄清楚,与 CUDA 类型转换内在函数 __double2loint__double2hiint__hiloint2double 等效的 CPU 是什么。

我猜 _mm_cvttsd_si32 可能等同于 __double2loint(对吗?),但我没有找到 __double2hiint 和 __hiloint2double 的等价物。是否可以在 C 中实现此类函数的快速版本?

【问题讨论】:

  • 您可以使用union 在标准C 中轻松编写这些函数。
  • _mm_cvttsd_si32 不是重新解释,而是转换。您可以使用 _mm_castsi128_ps 等重新解释,但如前所述,您可以在 C 本身中进行。
  • 如何开始以实现上述任何 CUDA 类型转换内在函数?
  • 标准 C 中的代码比使用内部函数的代码快吗?

标签: c cuda sse intrinsics avx


【解决方案1】:

您可以通过联合来表达这些操作。只要启用优化 (nvcc -O3 ...),现代编译器就不会产生额外的开销。

double hiloint2double(int hi, int lo)
{
    union {
        double val;
        struct {
            int lo;
            int hi;
        };
    } u;
    u.hi = hi;
    u.lo = lo;
    return u.val;
}

int double2hiint(double val)
{
    union {
        double val;
        struct {
            int lo;
            int hi;
        };
    } u;
    u.val = val;
    return u.hi;
}

int double2loint(double val)
{
    union {
        double val;
        struct {
            int lo;
            int hi;
        };
    } u;
    u.val = val;
    return u.lo;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多