相当于 CUDA 类型转换内在函数 __double2loint、__double2hiint 和 __hiloint2double 的内在函数
Intrinsics equivalent to the CUDA Type Casting Intrinsics __double2loint, __double2hiint and __hiloint2double
我想弄清楚,CUDA 类型转换内在函数 CPU 的等价物是什么 __double2loint, __double2hiint and __hiloint2double。
我猜 _mm_cvttsd_si32 可能等同于 __double2loint(正确吗?),但我没有找到 __double2hiint 和 __hiloint2double 的等价物。可以在 C 中实现此类函数的快速版本吗?
您可以通过联合表达这些操作。只要优化开启 (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;
}
我想弄清楚,CUDA 类型转换内在函数 CPU 的等价物是什么 __double2loint, __double2hiint and __hiloint2double。
我猜 _mm_cvttsd_si32 可能等同于 __double2loint(正确吗?),但我没有找到 __double2hiint 和 __hiloint2double 的等价物。可以在 C 中实现此类函数的快速版本吗?
您可以通过联合表达这些操作。只要优化开启 (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;
}