可以计算Shader算法的时间复杂度吗?

时间:2017-04-27 23:27:37

标签: algorithm opengl graphics time-complexity computer-science

我目前正在参加算法分析课,我们得到了一个 这个学科的小组工作。教授要求我们在计算机科学中选择一些领域,选择算法并证明渐近极限(至少为O(N))。

所以我和我的同事选择了计算机图形算法,更具体地说是照明体积算法。

但算法书籍分析的所有代码都在CPU上运行。 OpenGL中生成的代码在GPU上运行,不能保证线性,因为它是由几个并行运行的CPU组成的。

这种行为会影响计算吗?有人可以帮我弄清楚从哪里开始吗?

这段代码是从NVIDIA网站中提取的: http://http.developer.nvidia.com/GPUGems3/gpugems3_ch13.html

import requests, json, time

session = requests.Session()

with open("./error2.jpg", 'rb') as f:
    res = session.post("http://rayinrice.com/upload/", files={"files": f})
    print("Status Code: *" + str(res.status_code))
    print("\nContent:\n" + res.content)

我认为渐近极限是样本的函数。 还需要考虑的是生成着色器所需的4个物理方程。在此先感谢所有社区的帮助!

3 个答案:

答案 0 :(得分:4)

算法的复杂性不会随着处理元素的数量而变化(对于有限数量的处理器)。多项式时间算法是多项式时间,无论是在CPU还是GPU上。换句话说,n 2 与(n / 320) 2 没有区别,因为“n”接近无穷大。

算法的复杂性不会改变; 执行时间确实如此。但这很复杂。快速排序和合并排序具有相同的nLog(n)复杂度,但实际上快速排序的速度更快。

渐近极限不是最终所有的表现。

答案 1 :(得分:0)

所有代码行都意味着一个恒定的执行时间(它们并不意味着循环或递归调用或类似的东西)。但是,循环内的行执行NUM_SAMPLES次。因此,一个着色器调用的执行时间将是:

O(NUMSAMPLES)

由于此着色器每像素执行一次,因此总执行时间将为:

O(NumSamples * ResolutionX * ResolutionY)

请记住,Nicol Bolas是对的,算法的复杂性没有改变,如果它在CPU上执行则具有相同的功能,但对于与硬件相关的问题则会更慢。

在更深入的分析中,您可以分析每个GPU内核的使用情况以及CPU的加速比,但是在这个简单的代码中......这并不重要,因为使用率可能非常接近100%。无论如何,要分析这一点,您需要了解GPU硬件架构和一般算法成本。

答案 2 :(得分:0)

uniform float exposure;
uniform float decay;
uniform float density;
uniform float weight;
uniform vec2 lightPositionOnScreen;
uniform sampler2D myTexture;
const int NUM_SAMPLES = 100 ;
void main()
{   
C1  vec2 deltaTextCoord=vec2(gl_TexCoord[0].st-lightPositionOnScreen.xy);                          
C2      vec2 textCoo = gl_TexCoord[0].st;                                                                         
C3      deltaTextCoord *= 1.0 /  float(NUM_SAMPLES) * density;                                        
C4      float illuminationDecay = 1.0;                                                                                 
n       for(int i=0; i < NUM_SAMPLES ; i++)     {                                          
C5              textCoo -= deltaTextCoord;                                                    
C6          vec4 sample = texture2D(myTexture, textCoo );                        
C7                     sample *= illuminationDecay * weight;                                   
C8              gl_FragColor += sample;                                                      
C9              illuminationDecay *= decay;                                                    
                                                }
C10                 gl_FragColor *= exposure;  
}

f(n) =∑_(i=0)^n〖(C_5+ C_6+ C_7+ C_8+ C_9)〗 + C_1 + C_2 + C_3 + C_4 + C_10

(C_5+ C_6+ C_7+ C_8+ C_9 )=K_1

(C_1 + C_2 + C_3 + C_4 + C_10)=K_2

因此: f(n)= Cp* K_1*n+ K_2

将Cp作为像素数。

是哪个 f(n)= θ(n) for each pixel.

@ dv1729评论在大学家庭作业的发展过程中确实有所帮助。

这证明了计算机图形算法分析可能非常具有欺骗性,因为我们都知道这种后处理在硬件上有多难,但是查看代码会向我们展示一个确实非常低的渐近极限。这里的常数可能非常高,基于物理的体积光测量背后的深刻数学可能会被忽视。