MulAdd implemented

This commit is contained in:
Francesco Gatti
2017-06-29 10:06:49 +00:00
parent 97226cbc78
commit cc99347560
6 changed files with 82 additions and 5 deletions
+45
View File
@@ -0,0 +1,45 @@
#include <iostream>
#include "Layer.h"
#include "kernels.h"
namespace tkDNN {
MulAdd::MulAdd(Network *net, dataDim_t input_dim, value_type mul, value_type add) :
Layer(net, input_dim) {
this->mul = mul;
this->add = add;
int size = input_dim.tot();
// create a vector with all value setted to add
value_type *add_vector_h = new value_type[size];
for(int i=0; i<size; i++)
add_vector_h[i] = add;
checkCuda( cudaMalloc(&add_vector, size*sizeof(value_type)));
checkCuda( cudaMemcpy(add_vector, add_vector_h, size*sizeof(value_type), cudaMemcpyHostToDevice));
delete [] add_vector_h;
checkCuda( cudaMalloc(&dstData, input_dim.tot()*sizeof(value_type)) );
}
MulAdd::~MulAdd() {
checkCuda( cudaFree(add_vector) );
checkCuda( cudaFree(dstData) );
}
value_type* MulAdd::infer(dataDim_t &dim, value_type* srcData) {
matrixMulAdd(net->cublasHandle, srcData, dstData, add_vector, input_dim.tot(), mul);
//update data dimensions
dim = output_dim;
return dstData;
}
}
+10
View File
@@ -53,4 +53,14 @@ void matrixTranspose(cublasHandle_t handle, value_type* srcData, value_type* dst
float const alpha(1.0);
float const beta(0.0);
checkERROR( cublasSgeam( handle, CUBLAS_OP_T, CUBLAS_OP_N, m, n, &alpha, A, n, &beta, A, m, clone, m ));
}
void matrixMulAdd( cublasHandle_t handle, value_type* srcData, value_type* dstData,
value_type* add_vector, int dim, value_type mul) {
checkCuda( cudaMemcpy(dstData, add_vector, dim*sizeof(value_type), cudaMemcpyDeviceToDevice));
value_type alpha = mul;
checkERROR( cublasSaxpy(handle, dim, &alpha, srcData, 1, dstData, 1));
}