From 4df8323b259981486e569d5d5a963a09c469a052 Mon Sep 17 00:00:00 2001 From: Alejandro Saucedo Date: Tue, 4 Aug 2020 21:12:09 +0100 Subject: [PATCH] Updated shaders to match example in slides --- shaders/glsl/computeheadless.comp | 38 +++++++----- shaders/glsl/computeheadless.comp.spv | Bin 1780 -> 2008 bytes shaders/glsl/machinelearning.comp | 84 ++++++++++++++++++++++++++ 3 files changed, 106 insertions(+), 16 deletions(-) create mode 100644 shaders/glsl/machinelearning.comp diff --git a/shaders/glsl/computeheadless.comp b/shaders/glsl/computeheadless.comp index 869415659..094b9ae34 100644 --- a/shaders/glsl/computeheadless.comp +++ b/shaders/glsl/computeheadless.comp @@ -1,33 +1,39 @@ #version 450 +// This variable is set by the pipeline +layout (constant_id = 0) const uint BUF_SIZE = 32; + layout(binding = 0) buffer Pos { uint values[ ]; }; -layout (local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +layout (local_size_x = 4, local_size_y = 1, local_size_z = 1) in; -layout (constant_id = 0) const uint BUFFER_ELEMENTS = 32; +shared uint sharedTotal[1]; -uint fibonacci(uint n) { - if(n <= 1){ - return n; - } - uint curr = 1; - uint prev = 1; - for(uint i = 2; i < n; ++i) { - uint temp = curr; - curr += prev; - prev = temp; - } - return curr; +uint mod(uint x, uint N) { + return (x % N + N) % N; } void main() { uint index = gl_GlobalInvocationID.x; - if (index >= BUFFER_ELEMENTS) + if (index >= BUF_SIZE) return; - values[index] = fibonacci(values[index]); + + sharedTotal[0] = 0; + + barrier(); + memoryBarrierShared(); + + atomicAdd(sharedTotal[0], values[index]); + + barrier(); + memoryBarrierShared(); + + uint adjacentSum = values[mod(index+1, BUF_SIZE)] + values[mod(index-1, BUF_SIZE)]; + + values[index] = sharedTotal[0] + adjacentSum; } diff --git a/shaders/glsl/computeheadless.comp.spv b/shaders/glsl/computeheadless.comp.spv index 0c88bfe72eff1aa9fd58b518de4ba7e6a32b4386..12f9be813065aa8d184690b1a97d7fa0ec3fb6db 100755 GIT binary patch literal 2008 zcmaKt$xc*J5QeWnLklY4gacv&aaI%@01;%;21Ui78#m@^6U8*$hAA$MJ730!@JV#* z3usIVnNpgKbH&C&}~kG^wrbqzNWTI+E7R7nfF+hBmiK zLpN?-Q*j_^&V*_@(d6(g*m}BFapO4F1uxf)>D6k@{50Xe66DxvJePy%U~j!zI=?+U z!9O+4$zHe*n7AGPIKwT;QT$q^v|8KCXLa9{Ulz;NS7~{%vQvGXZmm@-i}RU2mz>7W zKEMBRW%0#5Ao+61dHm+vbYr#jth$w!vl_#2%hk>7W@6V)THapWto3lcMrG&6!D;DT z`g*mpwX(eq*OJ_Ud!KHk>v-eIUGdzm*#1IaMDP3g4!xMMefxGUV~5a+`F0Cbh#m)t zT}9qW&MB$4-vP`Oaepn$;$^V)tb2&*IG=t_dtQ8m9M&sft^zS1O=j}_^pMAkgYQAp zQ|HX%nPd1pnEXUNwx--AV$YwzT@c0_L@t%=0&pEtr zC2w70=Pu{nF5nB8=gnt)5p#L|5?-x2quv#;ZxitlI8TC8yjsks59}O_%`<}cjGTQK zI~zIoZ`N^RohNYCzD#xB%~{ELH|-X0?|C&Y-})C!4sQ+T;qQq)V!zqO*zdJ5_IquN z=XS;O^>~IV&dBf7IXb&ZYTExPOn!=vtZy89ePFpSoG;+}F*#@Z6a66G^_yJo4PbKK zOZY(qqE*e?qeSQ^d)lU@jlK-PV9Vqt8tWSr!aqi)wmZu z-vvj{YNFOO*u98nz}Eg$uRRNvi`vd#&f3ntvGzS;YpZcDYTpM(Z8cG=2zD>-xd5KV zLHwboLK^!Cu%$btC5fX{68f6vxc?h)cSpmVg7FUzTVH3 z$41e$;rBM+cCg>$K791Bzpjb+0I|By^_-nxHS(e90;`F>yTR(@Lvs+^nCB3&I{Cl! IU~KRI0PwGP#sB~S literal 1780 zcmZ9MX-^YT6oyA?5k&-)#Raeh7hFI=)*uLIDI{o&=x0(&HBCxO$`U{Ni;VFn_@mqs zjn6YPH)*`&aNhT9_nb4+$+V4~i=s182Y*{pa(bgSEK$@Mwa2=+y|X=ebi6+~GyB+x zOHn2cG^U%FEcz^RP^#8-7}SGZTQ6c{=Xp5WEhc2Hqo2Z!gqYs;v(}ZWD0YEkN<%BTsp2c>RT^je|t2CUVpc-QFyak*e<**yn4G6_wy9{>&8($z1VYFs-0Ah zl73ebQ+($-_^{M09iWT!?|wRwp_F@v`|;>^=61y0Y*HcAAA@^}>_eMR!FcZ)MLdD$ z6B_ePu=ia zbBJ-~$;VSZ2%iL7*IvB$QR>salydhK@{OHBJjPF>^=Y4mtKDY~8K!F3zV`g{iV82=ot&-xGfZ-4I99R!)cH1izDAU@ zJVBh-8JEfNz8OUO3Kh+l2j47M+h_892J?tEckqMwMYQKPwe&3@+U!gGhwX{Ag_^5i zYX-iS@-@0~5B@gXmHW{b;tJrzmx-K9zDQrruz~p7)*k8Anw$B zb3ML?^UUQA{U+GE?{?Uy--g!x`fX_C1OM?{%EJs7;nw|{?z0=LtqXCVe$PDaQ(q6F z%|67T&SkK5{$dyFH_m5hkJc00U%>X}Z|4`WSJCFEzjN1h^bN$Le+aE#9qt?kTO;rh zuswW9XSoSBM!WsX{U%u3TH=tK2ivDT=Fsxs8wJ~U;A3E8Kc&y=7Fe5cVP0(^{x&$5 r`m7^&Cg-ycb%?zKcBWAK9$1^-5Nqqx*19w23HkTI_U3aC`%e7>@fdL1 diff --git a/shaders/glsl/machinelearning.comp b/shaders/glsl/machinelearning.comp new file mode 100644 index 000000000..461b156cf --- /dev/null +++ b/shaders/glsl/machinelearning.comp @@ -0,0 +1,84 @@ +#version 450 + +// This variable is set by the pipeline +layout (constant_id = 0) const uint BUFFER_ELEMENTS = 32; + +layout(binding = 0) buffer Pos { + uint values[ ]; +}; + +layout (local_size_x = 4, local_size_y = 1, local_size_z = 1) in; + +float learningRate = 0.01; + +uint fibonacci(uint n) { + if(n <= 1){ + return n; + } + uint curr = 1; + uint prev = 1; + for(uint i = 2; i < n; ++i) { + uint temp = curr; + curr += prev; + prev = temp; + } + return curr; +} + +float sigmoid(float z) { + return 1.0 / (1.0 + exp(-z)); +} + +float forwardProp(float x, float w, float b) { + float z = dot(w, x) + b; + float yHat = sigmoid(z); + return yHat; +} + +void backwardProp(float x, float yHat, float y, float m, out float w, out float b) { + float dZ = yHat - y; + float dW = (1/m) * x * dZ; + float dB = (1/m) * dZ; + w -= (learningRate * dW); + b -= (learningRate * dB); +} + +float calculateLoss(float yHat, float y) { + return -(y * log(yHat) + (1.0 - y) * log(1.0 - yHat)); +} + +shared uint sharedTotal[1]; + +void main() +{ + uint index = gl_GlobalInvocationID.x; + if (index >= BUFFER_ELEMENTS) + return; + +// float m = int(BUFFER_ELEMENTS); +// float w = 0.001; +// float b = 0.0; +// +// float x = values[index]; +// +// float yHat = forwardProp(x, w, b); +// float loss = calculateLoss(yHat, x); +// +// backwardProp(x, yHat, x, m, w, b); +// +// values[index] = fibonacci(values[index]); + + sharedTotal[0] = 0; + + barrier(); + memoryBarrierShared(); + + atomicAdd(sharedTotal[0], values[index]); + + barrier(); + memoryBarrierShared(); + + values[index] = int(sharedTotal[0]); +} + +