commit ca08263f2ff0cba7e76a66ebe99305a6e3a114b8
parent 2d1fe04feb6f0f4bbe59bdba540b81478f2c5b2d
Author: David Freifeld <freifeld.david@gmail.com>
Date: Fri, 10 Jul 2020 17:13:14 -0700
Extending float changes to strassen + utils
Diffstat:
2 files changed, 38 insertions(+), 37 deletions(-)
diff --git a/tests/strassen.cpp b/tests/strassen.cpp
@@ -11,7 +11,7 @@
#include <iostream>
// Not remotely extensible, just initial test.
-Eigen::MatrixXd strassen_mul(Eigen::MatrixXd x, Eigen::MatrixXd y)
+Eigen::MatrixXf strassen_mul(Eigen::MatrixXf x, Eigen::MatrixXf y)
{
int power = 0;
int largest;
@@ -23,22 +23,23 @@ Eigen::MatrixXd strassen_mul(Eigen::MatrixXd x, Eigen::MatrixXd y)
std::cout << pow(2, power) << " " << power <<"\n";
}
std::cout << "POWER: " << power << " LARGEST: " << largest << "\n";
- Eigen::MatrixXd a ((int)pow(2,power), (int)pow(2,power));
- Eigen::MatrixXd b ((int)pow(2,power), (int)pow(2,power));
+ Eigen::MatrixXf a ((int)pow(2,power), (int)pow(2,power));
+ Eigen::MatrixXf b ((int)pow(2,power), (int)pow(2,power));
a.block(0,0,x.rows(), x.cols()) = x;
b.block(0,0,y.rows(), y.cols()) = y;
- //Eigen::MatrixXd a ()
+ std::cout << "\nINIT\n" << a << "\n\n" << b << "\n\n\n";
+ std::cout << "\nEIGEN_VER\n" << a*b << "\n\n\n";
+ //Eigen::MatrixXf a ()
int block_len = largest/2;
- Eigen::MatrixXd result ((int)pow(2,power), (int)pow(2,power));
-
- Eigen::MatrixXd m1 = ((a.block(0,0, block_len, block_len)) + a.block(a.rows()-block_len,a.cols()-block_len, block_len, block_len)) * (b.block(0,0, block_len, block_len) + b.block(b.rows()-block_len,b.cols()-block_len, block_len, block_len));
- Eigen::MatrixXd m2 = (a.block(a.rows()-block_len, 0, block_len, block_len) + a.block(a.rows()-block_len,a.cols()-block_len, block_len, block_len)) * (b.block(0,0, block_len, block_len));
- Eigen::MatrixXd m3 = a.block(0,0, block_len, block_len) * (b.block(0,b.cols()-block_len, block_len, block_len) - b.block(b.rows()-block_len,b.cols()-block_len, block_len, block_len));
- Eigen::MatrixXd m4 = a.block(a.rows()-block_len,a.cols()-block_len, block_len, block_len) * (b.block(b.rows()-block_len,0, block_len, block_len) - b.block(0,0, block_len, block_len));
- Eigen::MatrixXd m5 = (a.block(0, 0, block_len, block_len) + a.block(0,a.cols()-block_len, block_len, block_len)) * (b.block(b.rows()-block_len,b.cols()-block_len, block_len, block_len));
- Eigen::MatrixXd m6 = (a.block(a.rows()-block_len,0, block_len, block_len) - a.block(0,0, block_len, block_len)) * (b.block(0,0, block_len, block_len) + b.block(0,b.cols()-block_len, block_len, block_len));
- Eigen::MatrixXd m7 = (a.block(0,a.cols()-block_len, block_len, block_len) - a.block(a.rows()-block_len,a.cols()-block_len, block_len, block_len)) * (b.block(a.rows()-block_len,0, block_len, block_len) + b.block(b.rows()-block_len,b.cols()-block_len, block_len, block_len));
+ Eigen::MatrixXf result ((int)pow(2,power), (int)pow(2,power));
+ Eigen::MatrixXf m1 = ((a.block(0,0, block_len, block_len)) + a.block(a.rows()-block_len,a.cols()-block_len, block_len, block_len)) * (b.block(0,0, block_len, block_len) + b.block(b.rows()-block_len,b.cols()-block_len, block_len, block_len));
+ Eigen::MatrixXf m2 = (a.block(a.rows()-block_len, 0, block_len, block_len) + a.block(a.rows()-block_len,a.cols()-block_len, block_len, block_len)) * (b.block(0,0, block_len, block_len));
+ Eigen::MatrixXf m3 = a.block(0,0, block_len, block_len) * (b.block(0,b.cols()-block_len, block_len, block_len) - b.block(b.rows()-block_len,b.cols()-block_len, block_len, block_len));
+ Eigen::MatrixXf m4 = a.block(a.rows()-block_len,a.cols()-block_len, block_len, block_len) * (b.block(b.rows()-block_len,0, block_len, block_len) - b.block(0,0, block_len, block_len));
+ Eigen::MatrixXf m5 = (a.block(0, 0, block_len, block_len) + a.block(0,a.cols()-block_len, block_len, block_len)) * (b.block(b.rows()-block_len,b.cols()-block_len, block_len, block_len));
+ Eigen::MatrixXf m6 = (a.block(a.rows()-block_len,0, block_len, block_len) - a.block(0,0, block_len, block_len)) * (b.block(0,0, block_len, block_len) + b.block(0,b.cols()-block_len, block_len, block_len));
+ Eigen::MatrixXf m7 = (a.block(0,a.cols()-block_len, block_len, block_len) - a.block(a.rows()-block_len,a.cols()-block_len, block_len, block_len)) * (b.block(a.rows()-block_len,0, block_len, block_len) + b.block(b.rows()-block_len,b.cols()-block_len, block_len, block_len));
std::cout << m1 + m4 - m5 + m7 << "\n\n" << m3+m5 << "\n\n" << m2+m4 << "\n\n" << m1-m2+m3+m6;
@@ -55,15 +56,15 @@ int main()
srand((unsigned int) time(0));
int sz;
std::cin >> sz;
- Eigen::MatrixXd a = Eigen::MatrixXd::Random(sz, 3);
- Eigen::MatrixXd b = Eigen::MatrixXd::Random(3, sz);
+ Eigen::MatrixXf a = Eigen::MatrixXf::Random(sz, 3);
+ Eigen::MatrixXf b = Eigen::MatrixXf::Random(3, sz);
auto eigen_begin = std::chrono::high_resolution_clock::now();
- Eigen::MatrixXd product = a * b;
+ Eigen::MatrixXf product = a * b;
auto eigen_end = std::chrono::high_resolution_clock::now();
auto strassen_begin = std::chrono::high_resolution_clock::now();
- Eigen::MatrixXd sproduct = strassen_mul(a, b);
+ Eigen::MatrixXf sproduct = strassen_mul(a, b);
auto strassen_end = std::chrono::high_resolution_clock::now();
std::cout << "EIGEN: " << std::chrono::duration_cast<std::chrono::nanoseconds>(eigen_end - eigen_begin).count() / pow(10,9) << " STRASSEN: " << std::chrono::duration_cast<std::chrono::nanoseconds>(strassen_end - strassen_begin).count() / pow(10,9) << "\n";
diff --git a/utils.hpp b/utils.hpp
@@ -4,26 +4,26 @@
#include <functional>
// A zoo of activation functions.
-double sigmoid(double x);
-double sigmoid_deriv(double x);
-double linear(double x);
-double linear_deriv(double x);
-double step(double x);
-double step_deriv(double x);
-double bipolar(double x);
-double bipolar_deriv(double x);
-double mytanh(double x);
-double tanh_deriv(double x);
-double lecun_tanh(double x);
-double lecun_tanh_deriv(double x);
-double cloglog(double x);
-double cloglog_deriv(double x);
-double softplus(double x);
-double softplus_deriv(double x);
-double inverse_logit(double x);
-double inverse_logit_deriv(double x);
-std::function<double(double)> rectifier(double (*activation)(double));
+float sigmoid(float x);
+float sigmoid_deriv(float x);
+float linear(float x);
+float linear_deriv(float x);
+float step(float x);
+float step_deriv(float x);
+float bipolar(float x);
+float bipolar_deriv(float x);
+float mytanh(float x);
+float tanh_deriv(float x);
+float lecun_tanh(float x);
+float lecun_tanh_deriv(float x);
+float cloglog(float x);
+float cloglog_deriv(float x);
+float softplus(float x);
+float softplus_deriv(float x);
+float inverse_logit(float x);
+float inverse_logit_deriv(float x);
+std::function<float(float)> rectifier(float (*activation)(float));
-Eigen::MatrixXd strassen_mul(Eigen::MatrixXd a, Eigen::MatrixXd b);
+Eigen::MatrixXf strassen_mul(Eigen::MatrixXf a, Eigen::MatrixXf b);
#endif /* MODULE_H */