From 672cc3c2fae530f11411620d1dd59469a471e360 Mon Sep 17 00:00:00 2001 From: fanasina Date: Thu, 1 Feb 2024 17:14:36 +0100 Subject: [PATCH] create cl test --- tensor_t/test_cl/Makefile | 75 +++++ tensor_t/test_cl/compile.sh | 24 ++ tensor_t/test_cl/is_good.c | 546 ++++++++++++++++++++++++++++++++++++ 3 files changed, 645 insertions(+) create mode 100644 tensor_t/test_cl/Makefile create mode 100644 tensor_t/test_cl/compile.sh create mode 100644 tensor_t/test_cl/is_good.c diff --git a/tensor_t/test_cl/Makefile b/tensor_t/test_cl/Makefile new file mode 100644 index 0000000..32b85e0 --- /dev/null +++ b/tensor_t/test_cl/Makefile @@ -0,0 +1,75 @@ + + + + +NAME_TEST=is_good +CC=gcc +ROOT_DIR=$(PWD) +YTESTDIR=$(PWD)/../../ytest_t +YPERMDIR=$(PWD)/../../ypermutation_t + +TENSDIR=$(PWD)/.. +DIMDIR=$(PWD)/../../dimension_t +INCLUDE_DIR=$(PWD)/../src +CFLAGS=-I$(INCLUDE_DIR) -I$(YPERMDIR)/src -I$(YTESTDIR)/include_ytest/include -I$(DIMDIR)/src -I$(TENSDIR)/src +LDFLAGS=-L$(YTESTDIR) -lytest -lOpenCL + +#SRC_DIR=$(ROOT_DIR)/src +#SRC=$(wildcard */*/*.c) +SRC=$(wildcard **/**/*.c) +#HEADS=$(OBJS:.o=.h) +TEST_DIR=$(PWD) + +EXECSRC=$(NAME_TEST).c +#EXECSRC=openF.c + +EXEC=launch_$(NAME_TEST)_m + +TENSRC=$(TENSDIR)/src/tensor_t/tensor_t.c +TENSRC_O=$(TENSRC:.c=.o) + +clTENSRC=$(TENSDIR)/src/tensor_t/cl_tensor_t.c +clTENSRC_O=$(clTENSRC:.c=.o) + + +PERMSRC_O=$(YPERMDIR)/src/permutation_t/permutation_t.o + +DIMSRC_O=$(DIMDIR)/src/dimension_t/dimension_t.o + +TOPTARGETS := all clean + +DEPS=$(DIMDIR) $(YPERMDIR) $(YTESTDIR) $(TENSDIR) + +OBJ=$(DIMSRC_O) $(PERMSRC_O) $(TENSRC_O) $(clTENSRC_O) + +LIB_YTEST=$(YTESTDIR)/libytest.so + + +$(TOPTARGETS): $(DEPS) + +$(DEPS): + $(MAKE) -C $@ $(MAKECMDGOALS) + + +#PERMSRC_O=$(PERMSRC:.c=.o) +#SETTSRC_O=$(PWD)/../src/set_theoric_t/set_theoric_t.o +#SETTSRC_O=$(SETTSRC:.c=.o) +#TOOLSRC=$(TOOLDIR)/src/tools_t/tools_t.c +#TOOLSRC_O=$(TOOLSRC:.c=.o) + + +all: $(EXEC) $(LIB_YTEST) + +$(EXEC): $(EXECSRC) $(OBJ) + $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS) + +.PHONY: clean mrproper + +clean: + rm -f $(OBJ) + +mrproper: clean + rm -f $(EXEC) + +run: $(EXEC) + $(EXEC) -h diff --git a/tensor_t/test_cl/compile.sh b/tensor_t/test_cl/compile.sh new file mode 100644 index 0000000..56bb1dd --- /dev/null +++ b/tensor_t/test_cl/compile.sh @@ -0,0 +1,24 @@ +#!/bin/bash + +if [ "$#" -le 0 ] ; then + echo "Usage: $0 is_good.c" >&2 + echo "for example to compile: is_good.c" >&2 + exit 1 +fi +if [ "$#" -le 1 ] ; then + echo "Usage: $0 $1" >&2 + echo " we can add more option for example '-D DEBUG=1' to have debug print, '-D HK' to have gtest like prompt, od '-g' to gbd" >&2 + echo "for example: $0 $1 \"-D DEBUG=1 -D HK -g\"" +fi + +DIR_YTEST=$PWD/../../ytest_t +SRC=../src +PERMSRC=$PWD/../../ypermutation_t/src + +gcc -o launch_is_good_c $1 -L$DIR_YTEST $2 -lytest -I$DIR_YTEST/include_ytest/include $PERMSRC/permutation_t/permutation_t.o $PERMSRC/set_theoric_t/set_theoric_t.o $SRC/dimension_t/dimension_t.c -I$SRC -I$PERMSRC +#gcc -o launch_is_good_c $1 $2 -lytest -I../include_ytest src/permutation_t/permutation_t.o src/set_theoric_t/set_theoric_t.o -I./src + +export LD_LIBRARY_PATH=$DIR_YTEST/:LD_LIBRARY_PATH + + +#gcc $1 src/ftest/ftest.c src/fmock/fmock.c src/tools_t/tools_t.c src/bar_progress/bar_progress.c src/permutation_t/permutation_t.c src/set_theoric_t/set_theoric_t.c -I./include $2 -o launch_is_good_c -lpthread diff --git a/tensor_t/test_cl/is_good.c b/tensor_t/test_cl/is_good.c new file mode 100644 index 0000000..eee207a --- /dev/null +++ b/tensor_t/test_cl/is_good.c @@ -0,0 +1,546 @@ +#include +#include +#include + +// for sleep ! +#ifdef __linux__ + #include +#elif _WIN32 + #include +#endif + +#include "ftest/ftest.h" +#include "ftest/ftest_array.h" +#include "fmock/fmock.h" + + +//#include "permutation_t/permutation_t.h" +#include "tensor_t/tensor_t.h" +#include "tensor_t/cl_tensor_t.h" + +TEST(rank){ + dimension *D=create_dim(4); + D->perm[0]=2; + D->perm[1]=3; + D->perm[2]=5; + D->perm[3]=6; + + updateRankDim(D); + tensor_TYPE_FLOAT *tf = CREATE_TENSOR_TYPE_FLOAT(D); + EXPECT_EQ(tf->dim->rank, 180); + +} + +void print_tensor_float(tensor_TYPE_FLOAT *M, char *msg){ + LOG("================= %s ===============\n",msg); + for(size_t i=0; idim->rank;++i) + LOG("[%ld]: %f ",i,M->x[i]); + + LOG("%s","\n"); +} + + +void print_tensor_double(tensor_TYPE_DOUBLE *M, char *msg){ + LOG("================= %s ===============\n",msg); + for(size_t i=0; idim->rank;++i) + LOG("[%ld]: %lf ",i,M->x[i]); + + LOG("%s","\n"); +} + + +TEST(tensorProd ){ + dimension *d0=create_dim(3); + dimension *d1=create_dim(2); + + d0->perm[0]=2; + d0->perm[1]=3; + d0->perm[2]=2; + + d1->perm[0]=2; + d1->perm[1]=3; + + updateRankDim(d0); + updateRankDim(d1); + + + tensor_TYPE_FLOAT *M0 = CREATE_TENSOR_TYPE_FLOAT(d0); + tensor_TYPE_FLOAT *M1 = CREATE_TENSOR_TYPE_FLOAT(d1); + + LOG("M0->dim->rank = %ld\n",M0->dim->rank); + LOG("M1->dim->rank = %ld\n",M1->dim->rank); + for(size_t i=0; idim->rank;++i) M0->x[i]=i*0.1 +1; + for(size_t i=0; idim->rank;++i) M1->x[i]=i*0.003 + 2; + + print_tensor_float(M0,"M0"); + print_tensor_float(M1,"M1"); + + + tensor_TYPE_FLOAT *M; + tensor_TYPE_FLOAT *Mn; + + tensorProd_TYPE_FLOAT(&M,M0,M1); + tensorProdNotOpt_TYPE_FLOAT(&Mn,M0,M1); + LOG("M->dim->rank = %ld\n",M->dim->rank); + + print_tensor_float(M,"M"); + + EXPECT_ARRAY_EQ_TYPE_FLOAT(M->x,M->dim->rank,Mn->x,Mn->dim->rank); + + print_tensor_float(Mn,"Mn"); +} + +TEST(tensorContractnProd_TYPE_FLOAT ){ + dimension *d0=create_dim(3); + dimension *d1=create_dim(2); + + d0->perm[0]=2; + d0->perm[1]=3; + d0->perm[2]=2; + + d1->perm[0]=2; + d1->perm[1]=3; + + updateRankDim(d0); + updateRankDim(d1); + + + tensor_TYPE_FLOAT *M0 = CREATE_TENSOR_TYPE_FLOAT(d0); + tensor_TYPE_FLOAT *M1 = CREATE_TENSOR_TYPE_FLOAT(d1); + + LOG("M0->dim->rank = %ld\n",M0->dim->rank); + LOG("M1->dim->rank = %ld\n",M1->dim->rank); + for(size_t i=0; idim->rank;++i) M0->x[i]=i*0.1 +1; + for(size_t i=0; idim->rank;++i) M1->x[i]=i*0.003 + 2; + + print_tensor_float(M0,"M0"); + print_tensor_float(M1,"M1"); + + tensor_TYPE_FLOAT *M; + tensor_TYPE_FLOAT *MnO; + + tensorContractnProd_TYPE_FLOAT(&M, M0,M1,1); + tensorContractnProdNotOpt_TYPE_FLOAT(&MnO, M0,M1,1); + + + print_tensor_float(M,"M"); + print_tensor_float(MnO,"MnO"); + + // for(size_t i=0;idim->rank;++i) + // EXPECT_EQ_TYPE_FLOAT(M->x[i],MnO->x[i]); + + EXPECT_ARRAY_EQ_TYPE_FLOAT(M->x,M->dim->rank,MnO->x,MnO->dim->rank); + + +} + +TEST(tensorContractnProd_TYPE_FLOAT2 ){ + dimension *d0=create_dim(3); + dimension *d1=create_dim(3); + + d0->perm[0]=35; + d0->perm[1]=32; //3; + d0->perm[2]=23; + + d1->perm[0]=32; + d1->perm[1]=23;//3; + d1->perm[2]=44; + + updateRankDim(d0); + updateRankDim(d1); + + + tensor_TYPE_FLOAT *M0 = CREATE_TENSOR_TYPE_FLOAT(d0); + tensor_TYPE_FLOAT *M1 = CREATE_TENSOR_TYPE_FLOAT(d1); + + LOG("M0->dim->rank = %ld\n",M0->dim->rank); + LOG("M1->dim->rank = %ld\n",M1->dim->rank); + for(size_t i=0; idim->rank;++i) M0->x[i]=i*0.1 +1; + for(size_t i=0; idim->rank;++i) M1->x[i]=i*0.003 + 2; + +// print_tensor_float(M0,"M0"); +// print_tensor_float(M1,"M1"); + + tensor_TYPE_FLOAT *M; + tensor_TYPE_FLOAT *MnO; + + tensorContractnProd_TYPE_FLOAT(&M, M0,M1,2); +// print_tensor_float(M,"M"); + tensorContractnProdNotOpt_TYPE_FLOAT(&MnO, M0,M1,2); + + +// print_tensor_float(MnO,"MnO"); + + // for(size_t i=0;idim->rank;++i) + // EXPECT_EQ_TYPE_FLOAT(M->x[i],MnO->x[i]); + + //EXPECT_ARRAY_EQ_TYPE_FLOAT(M->x,M->dim->rank,MnO->x,MnO->dim->rank); + + +} + +TEST(cl_tensorContractnProd_TYPE_FLOAT2 ){ + dimension *d0=create_dim(3); + dimension *d1=create_dim(3); + + d0->perm[0]=35; + d0->perm[1]=32; //3; + d0->perm[2]=23; + + d1->perm[0]=32; + d1->perm[1]=23;//3; + d1->perm[2]=44; + + updateRankDim(d0); + updateRankDim(d1); + + + tensor_TYPE_FLOAT *M0 = CREATE_TENSOR_TYPE_FLOAT(d0); + tensor_TYPE_FLOAT *M1 = CREATE_TENSOR_TYPE_FLOAT(d1); + + LOG("M0->dim->rank = %ld\n",M0->dim->rank); + LOG("M1->dim->rank = %ld\n",M1->dim->rank); + for(size_t i=0; idim->rank;++i) M0->x[i]=i*0.1 +1; + for(size_t i=0; idim->rank;++i) M1->x[i]=i*0.003 + 2; + +// print_tensor_float(M0,"M0"); +// print_tensor_float(M1,"M1"); + + tensor_TYPE_FLOAT *M; + tensor_TYPE_FLOAT *MnO; + + tensorContractnProdNotOpt_TYPE_FLOAT(&M, M0,M1,2); +// print_tensor_float(M,"M"); + cl_tensorContractnProd_TYPE_FLOAT(&MnO, M0,M1,2); + + +// print_tensor_float(MnO,"MnO"); + + // for(size_t i=0;idim->rank;++i) + // EXPECT_EQ_TYPE_FLOAT(M->x[i],MnO->x[i]); + + //EXPECT_ARRAY_EQ_TYPE_FLOAT(M->x,M->dim->rank,MnO->x,MnO->dim->rank); + + +} + +TEST(cl_tensorContractnProd_TYPE_DOUBLE2 ){ + dimension *d0=create_dim(3); + dimension *d1=create_dim(3); + + d0->perm[0]=125; + d0->perm[1]=52; //3; + d0->perm[2]=63; + + d1->perm[0]=52; + d1->perm[1]=63;//3; + d1->perm[2]=54; + + updateRankDim(d0); + updateRankDim(d1); + + + tensor_TYPE_DOUBLE *M0 = CREATE_TENSOR_TYPE_DOUBLE(d0); + tensor_TYPE_DOUBLE *M1 = CREATE_TENSOR_TYPE_DOUBLE(d1); + + LOG("M0->dim->rank = %ld\n",M0->dim->rank); + LOG("M1->dim->rank = %ld\n",M1->dim->rank); + for(size_t i=0; idim->rank;++i) M0->x[i]=i*0.1 +1; + for(size_t i=0; idim->rank;++i) M1->x[i]=i*0.003 + 2; + + //print_tensor_double(M0,"M0"); + //print_tensor_double(M1,"M1"); + + tensor_TYPE_DOUBLE *M; + tensor_TYPE_DOUBLE *MnO; + + tensorContractnProdNotOpt_TYPE_DOUBLE(&M, M0,M1,2); + //tensorContractnProd_TYPE_DOUBLE(&M, M0,M1,2); + //print_tensor_double(M,"M"); + cl_tensorContractnProd_TYPE_DOUBLE(&MnO, M0,M1,2); + + + //print_tensor_double(MnO,"MnO"); + + // for(size_t i=0;idim->rank;++i) + // EXPECT_EQ_TYPE_DOUBLE(M->x[i],MnO->x[i]); + + EXPECT_ARRAY_EQ_TYPE_DOUBLE(M->x,M->dim->rank,MnO->x,MnO->dim->rank); + + +} + + +TEST(tensorContractnProd_TYPE_DOUBLE2 ){ + dimension *d0=create_dim(3); + dimension *d1=create_dim(3); + + d0->perm[0]=125; + d0->perm[1]=52; //3; + d0->perm[2]=63; + + d1->perm[0]=52; + d1->perm[1]=63;//3; + d1->perm[2]=54; + + updateRankDim(d0); + updateRankDim(d1); + + + tensor_TYPE_DOUBLE *M0 = CREATE_TENSOR_TYPE_DOUBLE(d0); + tensor_TYPE_DOUBLE *M1 = CREATE_TENSOR_TYPE_DOUBLE(d1); + + LOG("M0->dim->rank = %ld\n",M0->dim->rank); + LOG("M1->dim->rank = %ld\n",M1->dim->rank); + for(size_t i=0; idim->rank;++i) M0->x[i]=i*0.1 +1; + for(size_t i=0; idim->rank;++i) M1->x[i]=i*0.003 + 2; + + //print_tensor_double(M0,"M0"); + //print_tensor_double(M1,"M1"); + + tensor_TYPE_DOUBLE *M; + tensor_TYPE_DOUBLE *MnO; + + tensorContractnProd_TYPE_DOUBLE(&M, M0,M1,2); + //print_tensor_double(M,"M"); + //cl_tensorContractnProd_TYPE_DOUBLE(&MnO, M0,M1,2); + tensorContractnProdNotOpt_TYPE_DOUBLE(&MnO, M0,M1,2); + + //print_tensor_double(MnO,"MnO"); + + // for(size_t i=0;idim->rank;++i) + // EXPECT_EQ_TYPE_DOUBLE(M->x[i],MnO->x[i]); + + EXPECT_ARRAY_EQ_TYPE_DOUBLE(M->x,M->dim->rank,MnO->x,MnO->dim->rank); + + +} + +TEST(TensorProdCL){ + dimension *d0=create_dim(3); + dimension *d1=create_dim(2); + + d0->perm[0]=2; + d0->perm[1]=3; + d0->perm[2]=2; + + d1->perm[0]=2; + d1->perm[1]=3; + + updateRankDim(d0); + updateRankDim(d1); + + + tensor_TYPE_FLOAT *M0 = CREATE_TENSOR_TYPE_FLOAT(d0); + tensor_TYPE_FLOAT *M1 = CREATE_TENSOR_TYPE_FLOAT(d1); + + LOG("M0->dim->rank = %ld\n",M0->dim->rank); + LOG("M1->dim->rank = %ld\n",M1->dim->rank); + for(size_t i=0; idim->rank;++i) M0->x[i]=i*0.1 +1; + for(size_t i=0; idim->rank;++i) M1->x[i]=i*0.003 + 2; + + print_tensor_float(M0,"M0"); + print_tensor_float(M1,"M1"); + + + tensor_TYPE_FLOAT *M; + tensor_TYPE_FLOAT *Mn; + + tensorProd_TYPE_FLOAT(&M,M0,M1); + cl_tensorProd_TYPE_FLOAT(&Mn,M0,M1); + LOG("M->dim->rank = %ld\n",M->dim->rank); + + print_tensor_float(M,"M"); + + EXPECT_ARRAY_EQ_TYPE_FLOAT(M->x,M->dim->rank,Mn->x,Mn->dim->rank); + + + print_tensor_float(Mn,"Mn"); +} + +TEST(VS_cl_tensorContractnProd_TYPE_DOUBLE2 ){ + dimension *d0=create_dim(3); + dimension *d1=create_dim(3); + + + d0->perm[0]=125; + d0->perm[1]=52; //3; + d0->perm[2]=63; + + d1->perm[0]=52; + d1->perm[1]=63;//3; + d1->perm[2]=154; + + updateRankDim(d0); + updateRankDim(d1); + + + tensor_TYPE_DOUBLE *M0 = CREATE_TENSOR_TYPE_DOUBLE(d0); + tensor_TYPE_DOUBLE *M1 = CREATE_TENSOR_TYPE_DOUBLE(d1); + + LOG("M0->dim->rank = %ld\n",M0->dim->rank); + LOG("M1->dim->rank = %ld\n",M1->dim->rank); + for(size_t i=0; idim->rank;++i) M0->x[i]=i*0.1 +1; + for(size_t i=0; idim->rank;++i) M1->x[i]=i*0.003 + 2; + + //print_tensor_double(M0,"M0"); + //print_tensor_double(M1,"M1"); + + //tensor_TYPE_DOUBLE *M; + tensor_TYPE_DOUBLE *MnO; + + //tensorContractnProdNotOpt_TYPE_DOUBLE(&M, M0,M1,2); + //tensorContractnProd_TYPE_DOUBLE(&M, M0,M1,2); + //print_tensor_double(M,"M"); + cl_tensorContractnProd_TYPE_DOUBLE(&MnO, M0,M1,2); + + + //print_tensor_double(MnO,"MnO"); + + // for(size_t i=0;idim->rank;++i) + // EXPECT_EQ_TYPE_DOUBLE(M->x[i],MnO->x[i]); + + //EXPECT_ARRAY_EQ_TYPE_DOUBLE(M->x,M->dim->rank,MnO->x,MnO->dim->rank); + + +} + + +TEST(VStensorContractnProd_TYPE_DOUBLE2 ){ + dimension *d0=create_dim(3); + dimension *d1=create_dim(3); + + d0->perm[0]=125; + d0->perm[1]=52; //3; + d0->perm[2]=63; + + d1->perm[0]=52; + d1->perm[1]=63;//3; + d1->perm[2]=154; + + updateRankDim(d0); + updateRankDim(d1); + + + tensor_TYPE_DOUBLE *M0 = CREATE_TENSOR_TYPE_DOUBLE(d0); + tensor_TYPE_DOUBLE *M1 = CREATE_TENSOR_TYPE_DOUBLE(d1); + + LOG("M0->dim->rank = %ld\n",M0->dim->rank); + LOG("M1->dim->rank = %ld\n",M1->dim->rank); + for(size_t i=0; idim->rank;++i) M0->x[i]=i*0.1 +1; + for(size_t i=0; idim->rank;++i) M1->x[i]=i*0.003 + 2; + + //print_tensor_double(M0,"M0"); + //print_tensor_double(M1,"M1"); + + tensor_TYPE_DOUBLE *M; + //tensor_TYPE_DOUBLE *MnO; + + tensorContractnProd_TYPE_DOUBLE(&M, M0,M1,2); + //print_tensor_double(M,"M"); + //cl_tensorContractnProd_TYPE_DOUBLE(&MnO, M0,M1,2); + //tensorContractnProdNotOpt_TYPE_DOUBLE(&MnO, M0,M1,2); + + //print_tensor_double(MnO,"MnO"); + + // for(size_t i=0;idim->rank;++i) + // EXPECT_EQ_TYPE_DOUBLE(M->x[i],MnO->x[i]); + + //EXPECT_ARRAY_EQ_TYPE_DOUBLE(M->x,M->dim->rank,MnO->x,MnO->dim->rank); + + +} +TEST(tensorProd_vs2d ){ + dimension *d0=create_dim(3); + dimension *d1=create_dim(2); + + d0->perm[0]=24; + d0->perm[1]=32; + d0->perm[2]=2; + + d1->perm[0]=64; + d1->perm[1]=16; + + updateRankDim(d0); + updateRankDim(d1); + + + tensor_TYPE_FLOAT *M0 = CREATE_TENSOR_TYPE_FLOAT(d0); + tensor_TYPE_FLOAT *M1 = CREATE_TENSOR_TYPE_FLOAT(d1); + + LOG("M0->dim->rank = %ld\n",M0->dim->rank); + LOG("M1->dim->rank = %ld\n",M1->dim->rank); + for(size_t i=0; idim->rank;++i) M0->x[i]=i*0.1 +1; + for(size_t i=0; idim->rank;++i) M1->x[i]=i*0.003 + 2; + + /*print_tensor_float(M0,"M0"); + print_tensor_float(M1,"M1");*/ + + + tensor_TYPE_FLOAT *M; + tensor_TYPE_FLOAT *Mn; + + cl_tensorProd_TYPE_FLOAT(&M,M0,M1); + tensorProd_TYPE_FLOAT(&Mn,M0,M1); + LOG("M->dim->rank = %ld\n",M->dim->rank); + + //print_tensor_float(M,"M"); + + EXPECT_ARRAY_EQ_TYPE_FLOAT(M->x,M->dim->rank,Mn->x,Mn->dim->rank); + + //print_tensor_float(Mn,"Mn"); +} + + + +TEST(tensorProd_vs2d ){ + dimension *d0=create_dim(3); + dimension *d1=create_dim(2); + + d0->perm[0]=24; + d0->perm[1]=32; + d0->perm[2]=2; + + d1->perm[0]=64; + d1->perm[1]=24; + + updateRankDim(d0); + updateRankDim(d1); + + + tensor_TYPE_FLOAT *M0 = CREATE_TENSOR_TYPE_FLOAT(d0); + tensor_TYPE_FLOAT *M1 = CREATE_TENSOR_TYPE_FLOAT(d1); + + LOG("M0->dim->rank = %ld\n",M0->dim->rank); + LOG("M1->dim->rank = %ld\n",M1->dim->rank); + for(size_t i=0; idim->rank;++i) M0->x[i]=i*0.1 +1; + for(size_t i=0; idim->rank;++i) M1->x[i]=i*0.003 + 2; + + /*print_tensor_float(M0,"M0"); + print_tensor_float(M1,"M1");*/ + + + tensor_TYPE_FLOAT *M; + tensor_TYPE_FLOAT *Mn; + + tensorProd_TYPE_FLOAT(&M,M0,M1); + //cl2d_tensorProd_TYPE_FLOAT(&Mn,M0,M1,24,24); + //cl2d_tensorProd_TYPE_FLOAT(&Mn,M0,M1,32,32); + cl2d_tensorProd_TYPE_FLOAT(&Mn,M0,M1,64,16); + LOG("M->dim->rank = %ld\n",M->dim->rank); + + //print_tensor_float(M,"M"); + + EXPECT_ARRAY_EQ_TYPE_FLOAT(M->x,M->dim->rank,Mn->x,Mn->dim->rank); + + //print_tensor_float(Mn,"Mn"); +} + + +int main(int argc, char **argv){ + + + run_all_tests_args(argc, argv); + + return 0; +}