在第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...