小编Sto*_*one的帖子

为什么编译器会在编译的汇编代码中生成额外的sqrts

我正在尝试使用以下简单的C代码来分析计算sqrt所需的时间,其中readTSC()是一个读取CPU循环计数器的函数.

double sum = 0.0;
int i;
tm = readTSC();
for ( i = 0; i < n; i++ )
   sum += sqrt((double) i);
tm = readTSC() - tm;
printf("%lld clocks in total\n",tm);
printf("%15.6e\n",sum);
Run Code Online (Sandbox Code Playgroud)

但是,当我使用打印出汇编代码时

gcc -S timing.c -o timing.s
Run Code Online (Sandbox Code Playgroud)

在英特尔机器上,结果(如下所示)令人惊讶?

为什么汇编代码中有两个sqrts,一个使用sqrtsd指令而另一个使用函数调用?它是否与循环展开和尝试在一次迭代中执行两个sqrts相关?

以及如何理解这条线

ucomisd %xmm0, %xmm0
Run Code Online (Sandbox Code Playgroud)

为什么它与%xmm0自身相比?

//----------------start of for loop----------------
call    readTSC
movq    %rax, -32(%rbp)
movl    $0, -4(%rbp)
jmp .L4
.L6:
cvtsi2sd    -4(%rbp), %xmm1
// 1. use sqrtsd instruction
sqrtsd  %xmm1, %xmm0
ucomisd %xmm0, …
Run Code Online (Sandbox Code Playgroud)

c assembly gcc x86-64 compiler-optimization

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

使用OpenGL/GLSL的HDR Bloom效果渲染管道

我已经使用OpenGL和GLSL集成了bloom HDR渲染......至少我认为!我不确定结果.

我按照英特尔网站的教程:

https://software.intel.com/en-us/articles/compute-shader-hdr-and-bloom
Run Code Online (Sandbox Code Playgroud)

关于高斯模糊效果,我严格遵循以下网站上有关性能的所有建议:

https://software.intel.com/en-us/blogs/2014/07/15/an-investigation-of-fast-real-time-gpu-based-image-blur-algorithms
Run Code Online (Sandbox Code Playgroud)

根据第一个网站:

"然后将明亮的通过输出缩小了4倍.每个缩小的亮通输出都用可分离的高斯滤波器模糊,然后加到下一个更高分辨率的亮通输出.最终输出是1/4大小的绽放,向上采样并在色调映射之前添加到HDR输出."

这是bloom流水线(上面的图片来自NSight NVIDIA Debugger).

我测试中窗口的分辨率是1024x720(对于这种算法的需要,这个分辨率将缩小4倍).

步骤1:

照明传递(材质传递+阴影蒙版传递+天空盒传递的混合):

在此输入图像描述

第2步:

将高光信息提取到明亮的通道中(准确地说,生成4个mipmaps纹理("亮通过输出然后缩小半个4倍" - > 1/2,1/4,1/8最后1/2 )):

在此输入图像描述

第3步:

"每个缩小的明亮通道输出都用可分离的高斯滤波器模糊,然后加到下一个更高分辨率的亮通输出."

我想确切地说,双线性过滤是启用的(GL_LINEAR),上面图片中的pexilization是将纹理大小调整到NSight调试器窗口(1024x720)的结果.

a)第1/16x1/16号决议(64x45)

"1/16x1/16模糊输出"

在此输入图像描述

b)第1/8x1/8号决议(128x90)

"1/8x1/8缩小亮度通道,结合1/16x1/16模糊输出"

在此输入图像描述

"1/8x1/8模糊输出"

在此输入图像描述

c)第1/4x1/4号决议(256x180)

"1/4x1/4缩小亮度通道,结合1/8x1/8模糊输出"

在此输入图像描述

"1/4x1/4模糊输出"

在此输入图像描述

d)第1/2x1/2号决议(512x360)

"1/2x1/2缩小亮度通道,结合1/4x1/4模糊输出"

在此输入图像描述

"1/2x1/2模糊输出"

在此输入图像描述

为了达到所需的mipmap级别,我使用了FBO调整大小(但也许在初始化时使用已经调整大小的FBO会更聪明,而不是多次调整相同的大小.你怎么看待这个想法?).

第4步:

色调映射渲染过程:

在此输入图像描述

在此之前,我想对我的工作提出外部建议.它是否正确?我不太确定第3步(降尺度和模糊部分)的结果.

我认为模糊效果不是很明显!但是我使用卷积内核35x35(我认为这就足够:)).

但我真的对一篇关于pdf的文章很感兴趣.这是bloom管道的演示文稿(演示文稿与我应用的演示文稿非常相似).

在此输入图像描述

链接:

https://www.google.fr/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0CCMQFjAA&url=https%3A%2F%2Ftransporter-game.googlecode.com%2Ffiles%2FRealtimeHDRImageBasedLighting. PDF&EI = buBhVcLmA8jaUYiSgLgK&USG = AFQjCNFfbP9L7iEiGT6gQNW6dB2JFVcTmA&BVM = bv.93990622,d.d24

正如你在图片中看到的那样,模糊出血效果比我强得多!你认为作者使用几个卷积内核(更高的分辨率)吗?

我不明白的第一件事是高斯模糊算法如何在第三张图片上显示出与白色(灰度值)不同的其他颜色.我仔细观察(高变焦)到明亮的画面(第二个),所有的像素似乎接近白色或白色(灰度).有一件事是肯定的:明亮的纹理上没有蓝色或橙色像素.那么我们如何解释从图2到图3的这种转变呢?这对我来说很奇怪.

我不明白的第二件事是图片3,4,5和6之间的模糊出血效果差异很大!在我的演示中,我使用35x35卷积内核,最终结果接近第三张图片.

你怎么解释这种差异?

PS:请注意,我使用GL_HALF_FLOAT和GL_RGBA16F像素内部格式初始化bloom渲染通道纹理(所有其他渲染通道初始化为GL_RGBA和GL_FLOAT数据类型).

我的程序有问题吗?

非常感谢您的帮助!

opengl shader glsl

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

单个sqrt()的运行速度如何比放入for循环时慢两倍

我正在进行一项实验,分析在C代码中计算单个sqrt所需的时间.我有两个策略.

一种是直接测量单个sqrt调用,另一种是在for循环中多次执行sqrt,然后计算平均值.C代码非常简单,如下所示:

long long readTSC(void);

int main(int argc, char** argv)
{
    int    n = atoi(argv[1]);
    //v is input of sqrt() making sure compiler won't 
    //precompute the result of sqrt(v) if v is constant
    double v = atof(argv[2]);. 
    long long tm;            //track CPU clock cycles
    double x;                //result of sqrt()
    //-- strategy I ---
    tm = readTSC();     //A function that uses rdtsc instruction to get the number of clock cycles from Intel CPU
    x  = sqrt(v);
    tm = readTSC() - tm; …
Run Code Online (Sandbox Code Playgroud)

c assembly gcc x86-64 compiler-optimization

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

标签 统计

assembly ×2

c ×2

compiler-optimization ×2

gcc ×2

x86-64 ×2

glsl ×1

opengl ×1

shader ×1