最近一直在研究fft算法。我使用 glsl 来更快地计算它。该算法工作正常,非常好,但时间测量的结果非常奇怪:
如果我做:
uniform sampler2D resultRe;
uniform sampler2D resultIm;
uniform int n;
void main(void)
{
float v = 2.0*n;
float x = gl_TexCoord[0].x - 0.5;
float y = gl_TexCoord[0].y - 0.5;
float re = texture2D(resultRe, vec2(x/n,y/n));
/* fft */
if(x<n*0.5){
gl_FragColor.r = re;//w1+w5;
gl_FragColor.g = re;}//w2+w6;}
if(x>n*0.5-1.0){
gl_FragColor.r = re;//w1-w5;
gl_FragColor.g = re;}//w2-w6;} //range of re <0,255>,
//but if I multiply re by
//-10000.0, the time of computing
//is almost the same.
}
计算 fft(按列)的时间约为83 毫秒(日志如下)。
- 创建 fbo:20.6251 毫秒
- 着色器:32.7854 毫秒
- 传输 GPU-CPU:29.8564 毫秒
但如果我这样做(现在,我返回计算的真正价值):
uniform sampler2D resultRe;
uniform sampler2D resultIm;
uniform int n;
void main(void)
{
float v = 2.0*n;
float x = gl_TexCoord[0].x - 0.5;
float y = gl_TexCoord[0].y - 0.5;
float iy = y/n; //for glsl purpose
float ix = x/n;
float w1=0.0, w2=0.0, w3=0.0, w4=0.0;
float rad = 0.0;
float g = x;
if(g>n*0.5-1.0) x-=n*0.5;
float rad2 = -dPI*g/n;
/* fft here */
float w5 = (w3*cos(rad2)-w4*sin(rad2));
float w6 = (w3*sin(rad2)+w4*cos(rad2));
if(x<n*0.5){
gl_FragColor.r = w1+w5;
gl_FragColor.g = w2+w6;}
if(x>n*0.5-1.0){
gl_FragColor.r = w1-w5;
gl_FragColor.g = w2-w6;}
}
我必须等待大约 500 毫秒才能得到结果(下面的日志)。
- 创建 fbo:24.7944 毫秒
- 着色器:456.967 毫秒
- 传输GPU-CPU:28.6295ms
问题是:为什么?执行时间不取决于值,是吗?我想不出任何主意。
为了加快数据传输,我试过使用这个: http: //www.mathematik.uni-dortmund.de/~goeddeke/gpgpu/tutorial3.html#prep但我失败了。
时间测量:http ://www.lighthouse3d.com/tutorials/opengl-short-tutorials/opengl-timer-query/
如果您需要更多详细信息,请询问。