小编nju*_*ffa的帖子

对于CUDA,是否可以保证三元运营商可以避免分支差异?

我已经阅读了很多关于CUDA分支差异的线索,告诉我使用三元运算符比if/else语句更好,因为三元运算符不会导致分支分歧.我想知道,对于以下代码:

foo = (a > b) ? (bar(a)) : (b);
Run Code Online (Sandbox Code Playgroud)

如果bar是另一个函数或更复杂的语句,那么是否仍然没有分支差异?

cuda

5
推荐指数
2
解决办法
1628
查看次数

准确的矢量化acosf()实现

acosf()如果平台支持融合乘加(FMA),则相对于无限精确(数学)结果,简单的实现可以轻松实现1.5 ulp的误差范围。这意味着结果与舍入至最近或偶数模式下的正确舍入结果之间的差值不得超过一个ulp。

但是,这种实现通常包括两个主要代码分支,它们将主要近似间隔[0,1]大致分为两半,如下面的示例代码所示。当针对SIMD体系结构时,这种多分支性会阻止编译器自动进行矢量化。

是否有另一种算法方法可以更轻松地实现自动矢量化,同时保持1.5 ulps的相同误差范围?可以假定为FMA提供平台支持。

/* approximate arcsin(a) on [-0.5625,+0.5625], max ulp err = 0.95080 */
float asinf_core(float a)
{
    float r, s;
    s = a * a;
    r =             0x1.a7f260p-5f;  // 5.17513156e-2
    r = fmaf (r, s, 0x1.29a5cep-6f); // 1.81669723e-2
    r = fmaf (r, s, 0x1.7f0842p-5f); // 4.67568673e-2
    r = fmaf (r, s, 0x1.329256p-4f); // 7.48465881e-2
    r = fmaf (r, s, 0x1.555728p-3f); // 1.66670144e-1
    r = r * s;
    r = fmaf (r, a, a);
    return r;
} …
Run Code Online (Sandbox Code Playgroud)

algorithm math floating-point simd

5
推荐指数
1
解决办法
192
查看次数

稳健而准确地计算两个浮点数的商的自然对数

computating一个明显的问题时log (a/b),其中ab是给定的精度两个非零正有限浮点操作数(这里称为本机精度),是商a/b可能无法表示为在精度的浮点数.此外,当源操作数的比率接近于1时,精度将会丢失.

这可能通过暂时切换到更高精度的计算来解决.但是这种更高的精度可能不容易获得,例如当原生精度是double并且long double简单地映射到时double.使用更高精度的计算也可能对性能产生非常显着的负面影响,例如在GPU上,其float计算吞吐量可能比double计算吞吐量高32倍.

人们可以决定使用商法则对数计算的log (a/b)作为log(a) - log(b),但是这暴露了计算到的风险消减取消ab接近对方,产生非常大的误差.

如何精确计算给定精度的两个浮点数的商的对数,例如误差小于2 ulps并且鲁棒地计算,即在中间计算中没有下溢和溢出,而不需要求高于本机精度计算?

c algorithm floating-point logarithm

5
推荐指数
1
解决办法
67
查看次数

将核碱基表示形式从 ASCII 转换为 UCSC .2 位

明确的 DNA 序列仅由核碱基腺嘌呤 (A)、胞嘧啶 (C)、鸟嘌呤 (G)、胸腺嘧啶 (T) 组成。对于人类消费,基数可以用相应的char大写或小写字母表示:A, C, G, T, 或a, c, g, t。然而,当需要存储长序列时,这种表示方式效率低下。由于只需要存储四个符号,因此可以为每个符号分配一个2位代码。UCSC指定的常用.2bit格式正是这样做的,使用以下编码:T = 、C = 、A = 、G = 。0b000b010b100b11

下面的 C 代码显示了为清晰起见而编写的参考实现。转换表示为序列的基因组序列的各种开源软件通常使用由每个序列char索引的 256 条目查找表。char这也与 的内部表示隔离char。然而,即使访问的是片上高速缓存,存储器访问也非常昂贵,并且通用表查找很难进行 SIMDize。因此,如果可以通过简单的整数算术来完成转换,则将是有利的。鉴于 ASCII 是占主导地位的char编码,我们可以对此进行限制。

将 ASCII 字符给出的核碱基转换为其.2bit表示形式的有效计算方法是什么?

/* Convert nucleobases A, C, G, T represented as either uppercase or lowercase
   ASCII characters …
Run Code Online (Sandbox Code Playgroud)

c algorithm bit-manipulation bioinformatics micro-optimization

5
推荐指数
2
解决办法
260
查看次数

GTX 680,每个线程的Keplers和最大寄存器

因为我很困惑,我问下面的问题......

在各种网站和论文中,我发现声明说Kepler体系结构增加了每个线程的寄存器数量,但在我的GTX680上,这似乎并不正确,因为RegsPerBlock是65536,因此对于1024个线程,它将是64个regs.我缺少什么?将来每个线程会有更多的寄存器吗?

关心丹尼尔

cuda

4
推荐指数
1
解决办法
992
查看次数

快速准确地迭代生成等距角度的正弦和余弦

在一些应用中,需要多个角度的正弦和余弦,其中角度是通过将相同大小的增量incr重复添加到起始值基数来导出的。出于性能原因,无需为每个生成的角度调用sin()标准cos()数学库函数(或可能是非标准sincos()函数),只计算一次sin(base)cos(base),然后导出所有其他角度是非常有利的通过应用角和公式计算正弦和余弦:

\n\n
\n

sin(基数+增量) = cos(增量) \xc2\xb7 sin(基数) + sin(增量) \xc2\xb7 cos(基数) \
n cos(基数+增量) = cos(增量) \xc2\xb7 cos (基数) - sin(增量) \xc2\xb7 sin(基数)

\n
\n\n

这只需要一次性预计算比例因子sin(incr)cos(incr),而不管执行多少次迭代。

\n\n

这种方法有几个问题。如果增量很小,cos(incr)将是一个接近单位的数字,在以有限精度浮点格式计算时,会因隐式减法取消而导致精度损失。此外,由于计算没有以数值有利形式sin(base+incr) = sin(base) + adjustment排列,因此会产生比必要的更多的舍入误差,其中计算的数量adjustment 的幅度明显小于sin(base) (类似于余弦)。

\n\n

由于通常会应用数十到数百个迭代步骤,因此这些误差将会累积。如何以最有利于保持高精度的方式构建迭代计算?如果融合乘加运算 (FMA) 可用(通过标准数学函数fma()和公开),则应对算法进行哪些更改fmaf()

\n

c algorithm floating-point trigonometry

4
推荐指数
1
解决办法
1539
查看次数

使用标准 C 数学库精确计算 Lambert W 函数主分支

兰伯特W函数是f(w) = we w的反函数。它是一个多值函数,在复数上有无限多个分支,但在实数上只有两个分支,用 W 0和 W -1表示。W 0被认为是主分支,输入域为 [ -1/e, \xe2\x88\x9e ],W -1的输入域为 ( -1/e, 0 )。相应的实现通常称为\nlambert_w0()lambert_wm1()

\n

该函数的近亲首先由Leonard Euler [1]在跟进Johann Heinrich Lambert [2]的工作时发现。欧拉研究了超越方程x \xce\xb1 -x \xce\xb2 = (\xce\xb1 - \xce\xb2) vx \xce\xb1+\xce\xb2的解 ,并在此过程中考虑了简化情况ln x = vx \xce\xb1。在此过程中,他引入了一个辅助函数,该函数具有以下围绕零的级数展开式:

\n

y = 1 + (2 1 /(1\xc2\xb72))u + (3 2 /(1\xc2\xb72\xc2\xb73))u 2 + (4 3 /(1\xc2\xb72\xc2\ xb73\xc2\xb74))u 3 + (5 4 …

c algorithm math floating-point floating-accuracy

4
推荐指数
1
解决办法
449
查看次数

EJB3 DataSource DataSource.getConnection

在CMT J2EE环境(容器管理事务)中,当我JDNI查找DataSource对象并调用时,使用什么事务/连接DataSource.getConnection

这个连接是(可能是分布式的)交易的一部分吗?getConnection()每次我为同一个DataSource对象调用它时,是否返回相同的Connection?我只知道使用本机SQL语句由同一个EntityManager使用Connections.

这让我感到困惑.据我所知,SessionContext定义了一个每次使用数据源时都使用的事务系统.我有一个问题,在使用会话bean a DataSource.getConnection(),然后关闭此连接.如果遇到问题SessionContext.setForRollBack(true)则发出.

因此,服务的事务上下文如何与DataSource相关?

如果我们每次使用数据源或者至少查找数据源时都会生成一个新的连接,那么我就无法理解我已经知道的事情.任何澄清都会很精彩.我知道容器管理的事务和其他系统,但DataSource的实际行为完全超出了我.

java database ejb-3.0

3
推荐指数
1
解决办法
1027
查看次数

F(n)= F(n-1) - F(n-2)

我在编程竞赛中遇到了这个序列F(n)= F(n-1)-F(n-2); 鉴于F0和F1找到第n个术语

(http://codeforces.com/contest/450/problem/B)(比赛结束)

现在这个问题的解决方案是这样的.序列取值f0,f1,f1-f0,-f0,-f1,f0-f1然后再次f0并重复整个序列.

我知道这个值正在重复,但是找不到这个循环顺序的原因.我搜索了循环次序和序列,但找不到足够的材料可以给出循环原因的实际感觉.

math sequence discrete-mathematics cyclic

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

CUDA设备端代码中的C/C++"inline"关键字

当谈到CUDA时,我完全是"新手".所以,如果我的问题是微不足道的,请原谅我.

nvcc是否理解inlineC关键字的含义?
我知道__forceinline__,和类似的nvcc"宏",因此我不是在问如何编写inlinecuda设备端代码.
我也知道,我的代码在nvcc和c/c ++编译器之间"分开"(我正在使用Visual Studio IDE).
这是否意味着inline当nvcc"紧挨着" __device____global__内核时,nvcc会忽略该关键字?

编辑:
PS我曾搜索过cuda编程指南.我在inline条目下找不到任何有用的东西,类似的"标签"也无济于事.

c++ cuda inline keyword

3
推荐指数
1
解决办法
2672
查看次数

精确浮点计算两个乘积的和与差

两个乘积之差和两个乘积之和是在各种常见计算中发现的两个原语。diff_of_products (a,b,c,d) := ab - cd 和 sum_of_products(a,b,c,d) := ab + cd 是密切相关的伴随函数,仅部分操作数的符号不同。使用这些原语的示例是:

\n

计算 x = (a + i b) 和 y = (c + i d)的复数乘法:

\n

x*y = diff_of_products (a, c, b, d) + i sum_of_products (a, d, b, c)

\n

计算 2x2 矩阵的行列式:diff_of_products (a, d, b, c):

\n
| a  b |\n| c  d |\n
Run Code Online (Sandbox Code Playgroud)\n

在直角三角形中,计算斜边和相邻内切线的相对内切线的长度: diff_of_products (h, h, a, a)ha

\n

计算具有正判别式的二次方程的两个实数解:

\n

q = -(b + copysign …

algorithm floating-point floating-accuracy

3
推荐指数
1
解决办法
451
查看次数

IEEE浮点运算提供了哪些约束?

在以下断言中,(对于符合要求的实现)哪些是保证的,哪些不是?

  1. a + b是有限的==> a + b = b + a
  2. a*b是有限的==> a*b = b*a
  3. a是有限的==> a = - ( - a)
  4. a是有限的==> aa = 0
  5. a是有限的==> 0*a = 0
  6. ab = 0 ==> a = b
  7. a = b ==> ab = 0
  8. a = b和c + a是有限的==> c + a = c + b
  9. a> b ==> ab> 0
  10. ab> 0 ==> a> b

(请编辑此问题并使列表覆盖更多并具有有机外观.)

floating-point standards ieee-754

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

固定相对于父容器的位置

我试图将一个元素固定在一个容器中,但固定元素似乎是根据屏幕而不是父元素定位自己.

我的代码:

<div class="relative">
  <div class="absolute">
    <div class="fixed"></div>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

Css:

.relative{
  position: relative;
  height:800px;
  width: 400px;
  background: #000;
}

.absolute{
  height:60px;
  width: 60px;
  position: absolute;
  top:0;
  right:0;
  background: #ccc;
  -webkit-transform: translateZ(0); 
}

.fixed{
  height:20px;
  width: 20px;
  background: red;
  position: fixed;
  top:0;
  right:0;
}
Run Code Online (Sandbox Code Playgroud)

我想把红色框固定在灰色框内.但现在当我滚动框滚动并且仍未固定.

现场观看:http://codepen.io/undefinedtoken/pen/abhgc

html css

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