相关疑难解决方法(0)

pow(浮动,浮动)算法

我需要一个高效的算法在两个浮点数之间做数学::幂函数,你知道怎么做,(我需要算法不使用函数本身)

algorithm math floating-point

16
推荐指数
2
解决办法
1万
查看次数

80位扩展精度数据类型有哪些应用/优点?

是的,我的意思是说80位.这不是一个错字......

我对浮点变量的经验总是涉及4字节的倍数,如单音(32位),双音(64位)和长双音(我已经看到它被称为96位或128位).这就是为什么当我遇到一些代码来读取和写入AIFF(音频交换文件格式)文件时遇到80位扩展精度数据类型时我有点困惑:选择了一个扩展精度变量来存储采样音轨的速率.

当我浏览维基百科时,我发现上面的链接以及IEEE 754-1985标准摘要中的80位格式的简要提及(但不在IEEE 754-2008标准摘要中).看来,在某些架构上,"扩展"和"长双"是同义词.

我没有遇到的一件事是使用扩展精度数据类型的特定应用程序(当然,AIFF文件采样率除外).这让我想知道:

  • 有没有人遇到过扩展精度对某些编程应用来说是必要/有益的情况?
  • 80位浮点数有什么好处,除了显而易见的"它比双倍的精度稍高但比大多数长双精度的实现更少"?
  • 它的适用性正在减弱吗?

floating-point ieee-754

15
推荐指数
3
解决办法
5440
查看次数

CUDA中的双精度浮点

CUDA是否支持双精度浮点数?

另外,同样的原因是什么?

floating-point cuda gpu gpgpu

14
推荐指数
3
解决办法
2万
查看次数

SIMD使用无符号乘法对64位*64位到128位进行签名

我创建了一个使用SIMD进行64位*64位到128位的功能.目前我已经使用SSE2(acutally SSE4.1)实现了它.这意味着它可以同时运行两个64b*64b到128b的产品.同样的想法可以扩展到AVX2或AVX512,同时提供四个或八个64b*64到128b的产品.我的算法基于http://www.hackersdelight.org/hdcodetxt/muldws.c.txt

该算法进行一次无符号乘法,一次有符号乘法和两次有符号*无符号乘法.签名的*signed和unsigned*unsigned操作很容易使用_mm_mul_epi32_mm_mul_epu32.但混合签名和未签名的产品给我带来了麻烦.例如,考虑一下.

int32_t x = 0x80000000;
uint32_t y = 0x7fffffff;
int64_t z = (int64_t)x*y;
Run Code Online (Sandbox Code Playgroud)

双字产品应该是0xc000000080000000.但是如果你假设你的编译器知道如何处理混合类型,你怎么能得到这个呢?这就是我想出的:

int64_t sign = x<0; sign*=-1;        //get the sign and make it all ones
uint32_t t = abs(x);                 //if x<0 take two's complement again
uint64_t prod = (uint64_t)t*y;       //unsigned product
int64_t z = (prod ^ sign) - sign;    //take two's complement based on the sign
Run Code Online (Sandbox Code Playgroud)

使用SSE可以这样做

__m128i xh;    //(xl2, xh2, xl1, xh1) high is signed, low unsigned
__m128i …
Run Code Online (Sandbox Code Playgroud)

c x86 integer sse bit-manipulation

9
推荐指数
2
解决办法
4203
查看次数

优化快速乘法但缓慢添加:FMA和doubledouble

当我第一次使用Haswell处理器时,我尝试使用FMA来确定Mandelbrot集.主要算法是这样的:

intn = 0;
for(int32_t i=0; i<maxiter; i++) {
    floatn x2 = square(x), y2 = square(y); //square(x) = x*x
    floatn r2 = x2 + y2;
    booln mask = r2<cut; //booln is in the float domain non integer domain
    if(!horizontal_or(mask)) break; //_mm256_testz_pd(mask)
    n -= mask
    floatn t = x*y; mul2(t); //mul2(t): t*=2
    x = x2 - y2 + cx;
    y = t + cy;
}
Run Code Online (Sandbox Code Playgroud)

这确定n像素是否在Mandelbrot集中.因此对于双浮点,它运行超过4个像素(floatn = __m256d,intn = __m256i).这需要4个SIMD浮点乘法和4个SIMD浮点加法.

然后我修改了这个就像这样使用FMA

intn n = 0; …
Run Code Online (Sandbox Code Playgroud)

floating-point x86 assembly mandelbrot fma

9
推荐指数
1
解决办法
944
查看次数

在GPU上使用2个FP32仿真FP64

如果要模拟具有两个单精度浮点的双精度浮点,那么性能会是什么样的,并且可以做得好吗?

目前,Nvidia正在为双精度特斯拉卡充电,这使得您可以获得单精度性能的三分之一(值得注意的是Titan/Titan Black除外).

如果要使用具有gimped双精度的Geforce GPU并使用2个单精度浮点模拟双精度,性能会是什么样的?

floating-point double cuda

6
推荐指数
1
解决办法
2146
查看次数