From 163c4c0057d4d208175225ad242e6cc77ae2ca23 Mon Sep 17 00:00:00 2001 From: fanasina Date: Sun, 28 Jun 2026 20:42:10 +0200 Subject: [PATCH] update: [tensor] add transpose optimized function and tests --- tensor_t/src/tensor_t/tensor_t.c | 48 +++++++++++++++++++---- tensor_t/src/tensor_t/tensor_t.h | 1 + tensor_t/test/is_good.c | 67 ++++++++++++++++++++++++++++++-- 3 files changed, 106 insertions(+), 10 deletions(-) diff --git a/tensor_t/src/tensor_t/tensor_t.c b/tensor_t/src/tensor_t/tensor_t.c index 5abd031..96dfcdd 100644 --- a/tensor_t/src/tensor_t/tensor_t.c +++ b/tensor_t/src/tensor_t/tensor_t.c @@ -671,7 +671,7 @@ void tensorContractnProd_##type(tensor_##type** MM, tensor_##type *M0, tensor_## printf("checkContractProdTensorDim %ld contractionNumber\n", contractionNumber);\ printDebug_dimension(M0->dim, "M0 dim");\ printDebug_dimension(M1->dim, "M1 dim");\ - getchar();\ + /*getchar();*/\ }\ \ size_t len0 = M0->dim->size - contractionNumber;\ @@ -749,7 +749,7 @@ void tensorContractnProdOpt0_##type(tensor_##type** MM, tensor_##type *M0, tenso printf("checkContractProdTensorDim %ld contractionNumber\n", contractionNumber);\ printDebug_dimension(M0->dim, "M0 dim");\ printDebug_dimension(M1->dim, "M1 dim");\ - getchar();\ + /*getchar();*/\ }\ \ size_t len0 = M0->dim->size - contractionNumber;\ @@ -992,7 +992,7 @@ void tensorContractnProdThread_##type(tensor_##type** MM, tensor_##type *M0, ten printf("checkContractProdTensorDim %ld contractionNumber\n", contractionNumber);\ printDebug_dimension(M0->dim, "M0 dim");\ printDebug_dimension(M1->dim, "M1 dim");\ - getchar();\ + /*getchar();*/\ }\ size_t len0 = M0->dim->size - contractionNumber;\ size_t len1 = M1->dim->size - contractionNumber;\ @@ -1089,7 +1089,7 @@ void tensorContractnProdThreadOpt0_##type(tensor_##type** MM, tensor_##type *M0, printf("checkContractProdTensorDim %ld contractionNumber\n", contractionNumber);\ printDebug_dimension(M0->dim, "M0 dim");\ printDebug_dimension(M1->dim, "M1 dim");\ - getchar();\ + /*getchar();*/\ }\ size_t len0 = M0->dim->size - contractionNumber;\ size_t len1 = M1->dim->size - contractionNumber;\ @@ -1196,7 +1196,7 @@ void tensorContractnPro2dThread_##type(tensor_##type** MM, tensor_##type *M0, te printf("checkContractProdTensorDim %ld contractionNumber\n", contractionNumber);\ printDebug_dimension(M0->dim, "M0 dim");\ printDebug_dimension(M1->dim, "M1 dim");\ - getchar();\ + /*getchar();*/\ }\ \ size_t len0 = M0->dim->size - contractionNumber;\ @@ -1296,7 +1296,7 @@ void tensorContractnPro2dThreadOpt0_##type(tensor_##type** MM, tensor_##type *M0 printf("checkContractProdTensorDim %ld contractionNumber\n", contractionNumber);\ printDebug_dimension(M0->dim, "M0 dim");\ printDebug_dimension(M1->dim, "M1 dim");\ - getchar();\ + /*getchar();*/\ }\ \ size_t len0 = M0->dim->size - contractionNumber;\ @@ -1355,7 +1355,7 @@ void tensorContractnProdNotOpt_##type(tensor_##type** MM, tensor_##type *M0, ten printf("error Deep = %ld\n", contractionNumber);\ printDebug_dimension(M0->dim, "M0 dim");\ printDebug_dimension(M1->dim, "M1 dim");\ - getchar();\ + /*getchar();*/\ }\ size_t len0 = M0->dim->size - contractionNumber;\ size_t len1 = M1->dim->size - contractionNumber;\ @@ -1977,6 +1977,40 @@ tensor_##type * transpose_notOpt_tensor_##type(tensor_##type *org){\ return tens_tr;\ }\ \ +tensor_##type * transpose_Opt0_tensor_##type(tensor_##type *org){\ + size_t dimsz = (org->dim)->size; \ + dimension *dim_tr=create_dim(dimsz);\ + for(size_t i=0; iperm[i]=(org->dim)->perm[(dimsz-1)-i];\ + updateRankDim(dim_tr);\ + printDebug_dimension(dim_tr,"dim_trOpt");\ + tensor_##type *tens_tr = CREATE_TENSOR_##type(dim_tr);\ + long int base_i[dimsz+1];/* = (org->dim)->size;*/ \ + base_i[dimsz]=1;/*(org->dim)->perm[dimsz-1];*/\ + /*printf("DEBUG: base_i[%ld]=%ld\n",dimsz,base_i[dimsz]);*/\ + for(long int j=dimsz-1; j>=0; --j) { \ + base_i[j] =base_i[j+1]*(org->dim)->perm[j];\ + /*printf("DEBUG: base_i[%ld]=%ld\n",j,base_i[j]);*/\ + }\ + long int cur_tr=0, add_tr=0, minus_tr=0;\ + tens_tr->x[cur_tr] = org->x[cur_tr];\ + for(size_t i=1; irank; ++i){\ + minus_tr =0;\ + /*printf("DEBUG: cur_tr=%ld\n",cur_tr);*/\ + for(size_t l=0; lx[cur_tr] = org->x[i]*/;\ + tens_tr->x[i] = org->x[cur_tr];\ + break;\ + }\ + minus_tr -= (base_i[l]-base_i[l+1]);\ + }\ + /*printf("DEBUG: after cur_tr=%ld\n",cur_tr);*/\ + }\ + return tens_tr;\ +}\ +\ tensor_##type * permute_notOpt_tensor_##type(tensor_##type *org, dimension *dperm){\ size_t dimsz = (org->dim)->size; \ dimension *dim_tr=create_dim(dimsz);\ diff --git a/tensor_t/src/tensor_t/tensor_t.h b/tensor_t/src/tensor_t/tensor_t.h index 8fb2afc..ed26172 100644 --- a/tensor_t/src/tensor_t/tensor_t.h +++ b/tensor_t/src/tensor_t/tensor_t.h @@ -62,6 +62,7 @@ void append_array_chainlist_##type(array_chainlist_##type **list_a, type x);\ tensor_##type * create_tensor_from_list_array_##type( array_chainlist_##type *l_a, dimension *part_dim);\ void free_array_chainlist_##type(array_chainlist_##type *l_a);\ tensor_##type * transpose_notOpt_tensor_##type(tensor_##type *org);\ +tensor_##type * transpose_Opt0_tensor_##type(tensor_##type *org);\ tensor_##type * permute_notOpt_tensor_##type(tensor_##type *org, dimension *dperm);\ void update_1tensor_func_##type(tensor_##type *M0, \ type (*func)(type), size_t nbthread);\ diff --git a/tensor_t/test/is_good.c b/tensor_t/test/is_good.c index 4071c0a..3e989f4 100644 --- a/tensor_t/test/is_good.c +++ b/tensor_t/test/is_good.c @@ -17,7 +17,7 @@ //#include "permutation_t/permutation_t.h" #include "tensor_t/tensor_t.h" -#define VALGRIND_ 0 +#define VALGRIND_ 1 TEST(rank){ endian =true; @@ -911,7 +911,7 @@ TEST(tensorContractnProd_TYPE_FLOATNoOpt3endianFalse ){ d0->perm[1]=2; //3; d0->perm[2]=3; - d1->perm[0]=4; + d1->perm[0]=3; d1->perm[1]=2;//3; d1->perm[2]=5; @@ -922,7 +922,7 @@ TEST(tensorContractnProd_TYPE_FLOATNoOpt3endianFalse ){ d0->perm[1]=12; //3; d0->perm[2]=35; - d1->perm[0]=32; + d1->perm[0]=35; d1->perm[1]=12;//3; d1->perm[2]=13; #endif @@ -2168,6 +2168,67 @@ TEST(transpose_parseInput_unknownpart_to_tensor){ free_tensor_TYPE_FLOAT(t); free_tensor_TYPE_FLOAT(transpose); } +TEST(transpose_input_to_OpT_Ranspose){ + endian=true; + char *input="[*,3]"\ + "((1.1,1.2,1.3)"\ + "((2.1,2.2,2.3)"\ + "((3.1,3.2,3.3)"\ + "((4.1,4.2,4.3)"\ + "((5.1,5.2,5.3)"\ + "((6.1,6.2,6.3)"\ + "(7.1,7.2,7.3)) "; + + tensor_TYPE_FLOAT *t=parseInput_withDim_to_tensor_TYPE_FLOAT(input); + + print_tensor_msg_TYPE_FLOAT(t," tensor from input" ); + + + tensor_TYPE_FLOAT *transpose = transpose_notOpt_tensor_TYPE_FLOAT(t); + print_tensor_msg_TYPE_FLOAT(transpose," transpose from input" ); + tensor_TYPE_FLOAT *transpose_Opt0 = transpose_Opt0_tensor_TYPE_FLOAT(t); + print_tensor_msg_TYPE_FLOAT(transpose_Opt0," transpose_Opt0 from input" ); + + EXPECT_ARRAY_EQ_TYPE_FLOAT(transpose->x,transpose->dim->rank ,transpose_Opt0->x,transpose_Opt0->dim->rank); + + free_tensor_TYPE_FLOAT(t); + free_tensor_TYPE_FLOAT(transpose); + free_tensor_TYPE_FLOAT(transpose_Opt0); +} + +TEST(transpose_input_to_OpT_Ranspose2){ + endian=true; + char *input="[*,4,3]"\ + "(((1.11,1.12,1.13),(1.21,1.22,1.23),(1.31,1.32,1.33),(1.41,1.42,1.43)),"\ + "((2.11,2.12,2.13),(2.21,2.22,2.23),(2.31,2.32,2.33),(2.41,2.42,2.43)),"\ + "((3.11,3.12,3.13),(3.21,3.22,3.23),(3.31,3.32,3.33),(3.41,3.42,3.43)),"\ + "((4.11,4.12,4.13),(4.21,4.22,4.23),(4.31,4.32,4.33),(4.41,4.42,4.43)),"\ + "((5.11,5.12,5.13),(5.21,5.22,5.23),(5.31,5.32,5.33),(5.41,5.42,5.43)),"\ + "((6.11,6.12,6.13),(6.21,6.22,6.23),(6.31,6.32,6.33),(6.41,6.42,6.43)),"\ + "((7.11,7.12,7.13),(7.21,7.22,7.23),(7.31,7.32,7.33),(7.41,7.42,7.43)),"\ + "((8.11,8.12,8.13),(8.21,8.22,8.23),(8.31,8.32,8.33),(8.41,8.42,8.43)),"\ + "((9.11,9.12,9.13),(9.21,9.22,9.23),(9.31,9.32,9.33),(9.41,9.42,9.43)),"\ + "((10.11,10.12,10.13),(10.21,10.22,10.23),(10.31,10.32,10.33),(10.41,10.42,10.43)),"\ + "((11.11,11.12,11.13),(11.21,11.22,11.23),(11.31,11.32,11.33),(11.41,11.42,11.43)),"\ + "((12.11,12.12,12.13),(12.21,12.22,12.23),(12.31,12.32,12.33),(12.41,12.42,12.43)),"\ + "((13.11,13.12,13.13),(13.21,13.22,13.23),(13.31,13.32,13.33),(13.41,13.42,13.43)))"; + + tensor_TYPE_FLOAT *t=parseInput_withDim_to_tensor_TYPE_FLOAT(input); + + print_tensor_msg_TYPE_FLOAT(t," tensor from input" ); + + + tensor_TYPE_FLOAT *transpose = transpose_notOpt_tensor_TYPE_FLOAT(t); + print_tensor_msg_TYPE_FLOAT(transpose," transpose from input" ); + tensor_TYPE_FLOAT *transpose_Opt0 = transpose_Opt0_tensor_TYPE_FLOAT(t); + print_tensor_msg_TYPE_FLOAT(transpose_Opt0," transpose_Opt0 from input" ); + + EXPECT_ARRAY_EQ_TYPE_FLOAT(transpose->x,transpose->dim->rank ,transpose_Opt0->x,transpose_Opt0->dim->rank); + + free_tensor_TYPE_FLOAT(t); + free_tensor_TYPE_FLOAT(transpose); + free_tensor_TYPE_FLOAT(transpose_Opt0); +} TEST(permute_parseInput_unknownpart_to_tensor){ endian=true; char *input="[*,3]"\