GLSL層卷積(快取物件)

2021-10-09 15:54:25 字數 2680 閱讀 6932

在第11課《11.2-01bufferobject》中講了:著色器可以對「快取物件」讀寫。

我們的層卷積中,也用乙個「快取物件」傳送全部卷積核,並**卷積結果(前半部分結果,後半部分核)。

//核資料,核寬,輸入維度,輸出維度,偏置資料,輸入資料,輸出資料,是否啟用

//核大小:kw * kw * 輸入維度 * 輸出維度。

//輸入資料大小:wh * 輸入維度。 輸出資料大小:wh * 輸出維度。

//加法結果在fbo中,中間不用讀出,relu也在glsl中完成

void conv_glsl_層_buffer(float* kernel, int kw, int innum, int outnum, float *bias, float *indata, float * &outdata, bool active = true)

; int ksize = kw*kw;//一核大小

int wh = unheight * unwidth;//一通道大小

outdata = new float[wh*outnum];//全通道大小

//glgenbuffers(1, &buffout);//在初始化中生成

glbindbuffer(gl_shader_storage_buffer, buffout);

//結果大小+核大小

glbufferdata(gl_shader_storage_buffer, wh * outnum * sizeof(float) + ksize * innum * outnum * sizeof(float), null, gl_dynamic_copy);

glbindbufferbase(gl_shader_storage_buffer, 0, buffout);

//載入核

float* pp = (float*)glmapbuffer(gl_shader_storage_buffer, gl_read_write);

//後半部分存放核

pp += wh * outnum ;

memcpy(pp, kernel, ksize * innum * outnum * sizeof(float));

glunmapbuffer(gl_shader_storage_buffer);

if (glslprogram <= 0)

printf("failed to run shader.\n");

else

else

if (active)

gluniform1i(glgetuniformlocation(glslprogram, "active"), 1);//啟用

else

gluniform1i(glgetuniformlocation(glslprogram, "active"), 0);//啟用

} performcomputationg();

//取回結果

float *pout = (float *)glmapbuffer(gl_shader_storage_buffer, gl_read_write);

memcpy(outdata, pout, wh*outnum*sizeof(float));

glunmapbuffer(gl_shader_storage_buffer);

//清理

if (texture != 0)

glinvalidatebufferdata(buffout);//刪除緩衝中的資料

}

著色器中一次性完成整層卷積:

//卷積著色器 convolution.h

#version 430 core

#extension gl_ext_gpu_shader4 : enable

layout(std430, binding = 0) buffer bufferobject

; //紋理取樣器

uniform sampler2darray moonimage;

//寬uniform int w;

//高uniform int h;

//核寬

uniform int kw;

//偏置

uniform float bias[64];

//啟用

uniform int active;

//輸入

uniform int innum;

//輸出

uniform int outnum;

float relu(float i) else

} vec4 vec4relu(vec4 v)

void main()

index++;//遍歷核}}

fsum += bias[o];//加偏置

//啟用

if (active == 1)

fsum = vec4relu(fsum);

outdata[o*w*h + int(pos.y)*w + int(pos.x)] = fsum.r;

} }

這個一次完成比前面哪個「 conv_glsl_層_紋理陣列g」多次完成 只快了一點點,也不知是什麼原因?難道**的並行性較差?

結束

GLSL層卷積(紋理陣列)

在 opengl 紋理陣列 一文中看到紋理陣列只用乙個紋理物件就可以載入多個通道資料。在層卷積中能減少著色器執行次數。把輸入的多通道資料載入乙個紋理陣列中 int loadgltextures arrayg float ptexdata,int num 層卷積 核資料,核寬,輸入維度,輸出維度,偏置...

GLSL層卷積(寬 高 輸出通道數)(計算單位數)

增加計算單位數,可以加快計算速度。計算單位 從 iwidth iheight 增加到 iwidth iheight outnum mnumgroupsx iwidth int xsize iheight mnumgroupsy outnum mnumgroupsz 1 innum if iheigh...

反卷積層(轉置卷積)

反卷積 deconvolution 不是數字訊號處理裡面的意義,在深度學習裡面應該叫做轉置卷積 transposed convolution 又名微步卷積 fractionally strided convolutions 也有叫backward strided convolution upconv...