我目前正在参加算法分析课,我们得到了一个 这个学科的小组工作。教授要求我们在计算机科学中选择一些领域,选择算法并证明渐近极限(至少为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个物理方程。在此先感谢所有社区的帮助!
答案 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评论在大学家庭作业的发展过程中确实有所帮助。
这证明了计算机图形算法分析可能非常具有欺骗性,因为我们都知道这种后处理在硬件上有多难,但是查看代码会向我们展示一个确实非常低的渐近极限。这里的常数可能非常高,基于物理的体积光测量背后的深刻数学可能会被忽视。