First Vulkan Relise
This commit is contained in:
+30
-10
@@ -1,16 +1,36 @@
|
||||
#version 450
|
||||
|
||||
layout(local_size_x = 1) in; // Запускаем 1 поток
|
||||
layout(local_size_x = 256) in;
|
||||
|
||||
layout(std430, binding = 0) buffer InputBuffer {
|
||||
float a;
|
||||
float b;
|
||||
} inputs;
|
||||
layout(std430, binding = 0) buffer WeightBuffer { float weights[]; };
|
||||
layout(std430, binding = 1) buffer BiasBuffer { float biases[]; };
|
||||
layout(std430, binding = 2) buffer OutputBuffer { float outputs[]; };
|
||||
layout(std430, binding = 3) buffer ErrorBuffer { float errors[]; };
|
||||
|
||||
layout(std430, binding = 1) buffer OutputBuffer {
|
||||
float result;
|
||||
} outputs;
|
||||
layout(push_constant) uniform Params {
|
||||
uint prevLayerSize;
|
||||
uint nextLayerSize;
|
||||
uint weightOffset;
|
||||
uint biasOffset;
|
||||
uint outOffset;
|
||||
uint errOffset;
|
||||
float lr;
|
||||
} p;
|
||||
|
||||
void main() {
|
||||
outputs.result = inputs.a * inputs.b;
|
||||
}
|
||||
uint j = gl_GlobalInvocationID.x; // Индекс нейрона следующего слоя
|
||||
|
||||
if (j < p.nextLayerSize) {
|
||||
float errorTerm = p.lr * errors[p.errOffset + j];
|
||||
|
||||
// Обновляем веса, входящие в этот нейрон
|
||||
for (uint k = 0; k < p.prevLayerSize; k++) {
|
||||
uint wIdx = p.weightOffset + (j * p.prevLayerSize + k);
|
||||
uint outIdx = p.outOffset + k;
|
||||
weights[wIdx] += errorTerm * outputs[outIdx];
|
||||
}
|
||||
|
||||
// Обновляем биас этого нейрона
|
||||
biases[p.biasOffset + j] += errorTerm;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user