From 21736c114b0758bb559a08a7a19cbc426b358556 Mon Sep 17 00:00:00 2001 From: Trevor Barnes Date: Wed, 22 Feb 2023 22:17:40 -0600 Subject: [PATCH] large matrices working --- .vscode/tasks.json | 3 +- 03-MatrixAddition (fork)/matAddFork.c | 1 - 03-MatrixAddition (fork)/matAddSingle.c | 2 - 04-MatrixAddition (pthread)/matAddThread | Bin 0 -> 22008 bytes 04-MatrixAddition (pthread)/matAddThread.c | 123 ++++++++++++++++++++ 04-MatrixAddition (pthread)/matAddThread2 | Bin 0 -> 21216 bytes 04-MatrixAddition (pthread)/matAddThread2.c | 72 ++++++++++++ CS3841.code-workspace | 3 +- 8 files changed, 199 insertions(+), 5 deletions(-) create mode 100644 04-MatrixAddition (pthread)/matAddThread create mode 100644 04-MatrixAddition (pthread)/matAddThread.c create mode 100644 04-MatrixAddition (pthread)/matAddThread2 create mode 100644 04-MatrixAddition (pthread)/matAddThread2.c diff --git a/.vscode/tasks.json b/.vscode/tasks.json index ca4bbd1..b56e9d6 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -10,7 +10,8 @@ "${file}", "-o", "${fileDirname}/${fileBasenameNoExtension}", - "-lrt" + "-lrt", + "-pthread" ], "options": { "cwd": "${fileDirname}" diff --git a/03-MatrixAddition (fork)/matAddFork.c b/03-MatrixAddition (fork)/matAddFork.c index ab73382..868eb0b 100644 --- a/03-MatrixAddition (fork)/matAddFork.c +++ b/03-MatrixAddition (fork)/matAddFork.c @@ -11,7 +11,6 @@ #include #define NS_PER_SEC 1000000000 -#define MAX 10 static inline uint64_t gettime_ns() { struct timespec ts; diff --git a/03-MatrixAddition (fork)/matAddSingle.c b/03-MatrixAddition (fork)/matAddSingle.c index cd7bcbd..17bd44c 100644 --- a/03-MatrixAddition (fork)/matAddSingle.c +++ b/03-MatrixAddition (fork)/matAddSingle.c @@ -3,10 +3,8 @@ #include #include - #define NS_PER_SEC 1000000000 - static inline uint64_t gettime_ns() { struct timespec ts; clock_gettime(CLOCK_REALTIME, &ts); diff --git a/04-MatrixAddition (pthread)/matAddThread b/04-MatrixAddition (pthread)/matAddThread new file mode 100644 index 0000000000000000000000000000000000000000..4443b91ad240e4ad98e464b7faaa1a5d83d2663a GIT binary patch literal 22008 zcmeHPdwg6~oj-Rbx0z{@$uzH~t+d0V&;oh1^pQYIleW`NN=pkgQeNIpW+utVWG2j` z4?fTq1KM#KY*to^bR{S%>{h6&d@Q0%N_pv`pWsKOD~eq|MG`?N5i}w&`~98AScM+BKEs7gqX^d?KyPQg)-xdl#oI%Oqp zg{@LgLB-Gc^N=!ucJq2@qq@Ic= z#f1JFWIV0V10E$0zcOak+a~p_aIKVAkbF?O=Cx$-@A0=q>TUOMGt3IN3Nlkr`MU~w z6qmm>sb;=f`kSmBj>~gM5+gk^Heq=>I$k{nkn7 zpPhvMlS$|^5hxFM*7S7{CMqWdZz6hP68ic{=ybb!@NZ4efpCtMNI3decd|1c@&~C? z)ia}I>n0-@iibMFiDW3gb<>(iEE?MCZ;ONkZ$geVVSGFmjxvP=U^N*c4*{~hjJ3zQ zLtuyE@mQQ0Mk47C+-w9oZ#LTf;Rx$aB?F!QIO~pwqseyg!--g+vC(Kx1pLu<)*gt& z5+T;*k3?bt1_Zhtp=2`Lg@PG@U4ElI9Q8-Sw-QP|$$mU(boo)F_IN17)^BWCy~bEv zySR2~F25v~TeLivT@DK!U9qUNU?5C3{Lwv8fIH2GJAiOO6?Ap4Xt+br^!%Rm0H$V# zF{0bqo5)krU?Bjg#)XP-xP_)XE=2fs$V4wP(a)IZs*c1SHPO|WLG)dc zUWh!!O{IM%x{59F_M7Nxj3fF%6P-U_iHLN_L>J?hp!b{T`9_;vF^7shttGiWVkPf(}ZDU_>LS-6NQoCTXHx}5JramIh-a2 zBg0qaaGEfU3^(U+nkbD7FH$&a^Fb}uW-a6O0p4Z7Ll*od3*KtMH(7A61z%~wms;=| z3qIe1pJl--&G@33;|wHN7)?s&w8yM2nq}5c0#s>|OdR0t-L%rO)_||8AA<_^92d zJ?DGr!(;^vd|4WBWKXs8xGH_>ANy7ko24#l_4Ta$1Z92c*OJA)%*sy!847=x%?<_8 zIM3;~1J`bXZq7gH5AOt%GOf@_w?~mTl(n?gdTf3?Hzr?hr%x)xz`3rdLyrYW-e7)XNzVvfX zkZR$*)$sTT~f@olKRjskow+c{MO0tU0OCPi;APxMRJ?1+U)uXH96jvot$gt!-a(!eTwd;>AHUCwMC`8%_F*&o zaj-L$p9LqQ_u-0&`40JxpR$qpA<|8A`t#oXRKqtKeZ8%B3U^DdF&m0-KYEBPweHU~ zAzJv(w5`XxAMH}Zy<8-`GlgA$ z{#0;9CExlpuOzWw6zp%A*@IwbDjx+WqaVRFuab6A$-|&O?>&%LN!VK&H5>XA_oH`{ zrPc%EDtQ2v^bt>Ahbz1^dJphQ9;JGGoR?w&=btb5W1+sCET{Fkpo=Q?il#l5srC z3}ijtgIdq+2km?Af8Ki!$-l8QhazK8~51v zJlk{oL#*`9*I_18sq>22Ma9zILwsx~CSvQMT+GGT@N3+N`Bc8isJ_wkC-i4;f6suH zDf#&YjNSLgKcxrn8c0olYC4Pz9UskRd%XQ{`y`kd{Rv#T+y2}7(ataUF7h73kOh;^ z7b=s#g${gw1)|h!QGtF+qJ}{CNpuTPUViJyb}ty;!&5^(&zrB^*t;@u9%IcPZAt&M zxwR$zZu8dW^!u&8-kKoD*KAz)0nK@avVVa0;~&_Q^A^1#pLZM6BOBAdTbq8pIa~2d zU(X56*Z7OnZ)iSr!%fXMHs93zv1a2$dwXr^ygMm!eEvW)B^p-wJSsPH;_Ru*R0O6X zFcpER2uwxb|6~L-{yv4VIGZ12UV1^~;jfRv(GHJzJvCjD=@pZiI)8D{gGX#I7*2*` zQBN`!yV)~8lJZ3TQM@k-#G=6jrUlv@`(^Y_(TV?ox3by&fCtZHvqu5@0bc;z{&qIo z4cIc0&7J~m{(Uw}FD3c_J%HVKyf*=!0^AQssX_pz-Fh|CcDc1V#f6T8;1QjEGcW|( z*s)-2ZK0b09{X$w{_9bOK_a-^>s-|vN{eEDR|laS+zL_{Kb z690ps4*;q}zG(LDM;%6q=ykb2XjQLd$T!`kEI1qvn5o&J5#@x zR{VEA%*IHhpWeYDsk#3ynNh#ZdO`AOCzsOsvY>d^!c(<`l@cl-)!26VJ1TnhONrKP zlxW>V2|K<#&6IFd5){2bW>mQcq#UgqDJlPR1)BRE9X7Ig{oszP;$0%gUyv2U`zwyC za$#A>@h?a|wzN5}>LJbluYug}wk;Ox<>InQ!YvYRm#|yHeG(p&uwTNX5)Mc>DB&py zE$;p*>Sz)o>({Kg)U%+qEfr0sJdL$WYU^tjr8u@|&*J*p`X#lC779AM7#bq1qR}3a zKXp7u^(l+fmqDi$E?P>%yJuGX3pCn$$V{YYI|9?Tmu5DCZ+8@40?b}e*Z@%AuxpMv zgxd=Loq#s&ERN}KKvpl%@heuS==93SHb9)3Ib_8)A8l+uG%G^+FB1K}IXwS1<@;yz zd>fSP&zw#9X^zKnh4u5mFQmNVNnB1AEOPijaozyYf=dedqTJaHO2IPcV>5S+)37&IO22G z5Yo(%EzVcrx?nX&wmI)018b}NP~GmFPGajSI)HRKZG`xEsk@zP2x;L+(pgFdHWcjz z*yVha3~Vaf0%V`Fm`ZSE>9s&U;oL&VW=9u5kMl(myQ=hdAp4!=WZ=4z48TF>m1O#c znft*x=;)cFK)jOlpq&W<_fk7vBrOcgmQX%ME*si2>z7gLW5g2$_=G1pqyE_%SV6(rY>DBsTu=Q>XL2WL>ncCDlQ zSA@)uDgUUDIYIfyxQt!1eFI+H??PTH=4_|Eq6rw1`%SR4;xekW(_Y;~G@Md+kEkWn z-ldY->zgRFgGl*8 zF5w~xd*7RT$_qI@n|SuVQ+wRh?%KsJA4+2Hdw6d}C>jJ_Dez-^-F;wabw$*^_P#@V z-A7Py?J|k?@2z}5KD9ndzLDO-uvHOe+9f5z<>;QOho#6;A;H|ACL2qnz&m>wtGu&P z@RXIMy0FqDh2Gy&)hk8vtu&jh)K>{B^zxn32&}mOiJV6oxdvljlb)~QO=j=gx3}t}Qsf3HQsHOX)n(Ln_P(PS11g`C0<-~1=_P67dTHa% zy{yV9pXNJ-2#--)RS1~9Z$BB?Ck48tKots1f$We*4#3EVQYLINa*J%+gD^79L4CY< z1&X!_>b#@d+01i6)I8PHrVq+qLZcNW?eHG*lT0w}?8*`d*!s4x>L@Z=c_9ro>Vd;I zY`MZLf4l?SD&pGuwpAp<=rI*es*0^IQuQiH9&d#n04H<<>0QsOtDzgTFObjd&p7MJ~#9lVuXGfCY!DFcB(?5SFq+60Qr#n0o!+YJ2n6bIY|B`-M4sX5 zh^Fcq>%!4MBoz!XE+>)ka&2LBpT90rm)zYQ$`@ofDwD)(k*(rzPk{PMA{h*Z+G{&$ z8NfA=#o&`j##4c$v94vK7X(ykEC-En3`C4PiQNeUM|UDP7nG+)CvXzop@2}8hkx>{ z2Qd|@N#PO|iliZIGJOtn+SGkuFVl4A?{!z7UU*uc-KU>*TA%TP?mVb_n61EGr`Hg0 zY}3mnJdeW_`b>hgdJBOXy$(Rzpf4tHn(Jss^c94)>#GE@k-!n%NuXBO@6n5&)V1sM z`HMfH>%Z1rj&i+fgML9$KX-$!t<=wPT<lH_I-Ep1cW&LdYS2@b`l5eMU zJ;^QE>vcB_+8tlhD>z(%TMKxr{t@!CLC2{cl;|dX?sv_0PX66?Jm1kPQH0`e>m|E% z$4MTvf6z-#>t!c(XHu`K)7>xYGx~J5?ZPsB#ua+?le|E-`$WYz=w)_iJ4w!fq@&#| za=#KO>eA;tpjW{~yQoc_zKBqR%|u2(4LbL(`cV+BfngnRrKr$Au!EG1A>rKT7MEr?P#im!8HSK|R6OQ9|oB2J8veTh99MWT` z4OND2O_T|T>L8Nv?+6(*)kt*4;z6V=L-|{%{O(;zdvmheMjFZqau1 zG=K(gXHm5P!~;7-6Z6XR=&DBo^UK%r+zaoRoNs!Rh(=zNJ2Z+~Cxfw+u*eU2Ch5ub zmy#WivuZrGtjUgNTf>BOJ5%S&%{q2GUU#?vIk!QyD|LF)UMzL}I^A1eUZEXB~?SXt5>f3~_O9`uD zp6WSWA||kU68g21&=a70O!_L@i1K*Y`1|EE+>U$PlJ*d%EA25zdry`w!kIq+-3|NJ z`;PX9CX&C9=(h3W&(I|D^wa%`>{L%eUk*Bzhc%6ropNhIpMiepk#w>3%-BZIJtSaB zH;}w-7E}A%irvZWphO-)QT=%*=+wT0Sin-EH9nM6L-WvZ$rMz_~jCSWHisy5a(0?`w{T zr})=538t#=IiR02fjkSulZj*sznBlOv9DVg$u0w5l89pIj9FyN=!nGH{1GFF*?Ge7 zr*>fm)zuvdB}2j5hWcfgI!z=*-<=2>{&?KK8&khzd^f%}fyuEEOm%hbhKdO@Aeqb) zwXD(kM4eCDOp6f1Sa)^vCa>YWa;;&&V4jg6GuB>rW%H(%HTfJl)ikhzF}yx$!MFBm zW~|@1d3EzfWAnOo*Lb%YTboyJ^paKn$&5fE#jC?Vn9@@bwneYv{8s6MniSw=Br}hDyFAR-4$}g|!l3GA>}J%3(DU zig&ZxD3-Og*xIVa0vF{>?lzIyQek|-2z!}As(Ez_R>d8Ri+5tx%W8wWqi`W07D}A6 z1FJ-=gYysrym%<$Ck2`7#xlN^N4FN)+Kw1d%Fx2NHW}IllwtVQda59$1{osSL;3n)$bP|!jm=rw}48&4N&@OeW;+d{7Oziyx?K< zTLXowb)|6ZxTTFR+)se&F^VbUiZ8=pzd)C&nA2Yc1ZlgRkoR+J z?4tA)oCamHK5LS)^#UqC%7W5UcrlcTru?hDnMD6v4MP84 zRbU00tG7hiW~pzjXLyB>_~s<~svHE>y{Bvv^fU>qNjBIyKwn=2A#uG$!Gf~?0-cIiod5s; literal 0 HcmV?d00001 diff --git a/04-MatrixAddition (pthread)/matAddThread.c b/04-MatrixAddition (pthread)/matAddThread.c new file mode 100644 index 0000000..243fd92 --- /dev/null +++ b/04-MatrixAddition (pthread)/matAddThread.c @@ -0,0 +1,123 @@ +#include +#include +#include +#include +#include +#include + +#define NS_PER_SEC 1000000000 +#define OPS rows*cols +#define CORE 4 + +static int rows, cols; +int* matrix1; +int* matrix2; +int* result; + + + +void *addition(void *arg) { + int tid = *(int *)arg; + if(tid < OPS) { + for(int j = tid*(OPS/CORE); j < (tid*(OPS/CORE) + (OPS/CORE)); j++) { + result[j] = matrix1[j] + matrix2[j]; + } + } + free(arg); + return NULL; +} + + + +static inline uint64_t gettime_ns() { + struct timespec ts; + clock_gettime(CLOCK_REALTIME, &ts); + return ts.tv_sec * NS_PER_SEC + ts.tv_nsec; +} + +int main(int argc, char* argv[]) { + + // Debug args + //argv[1] = "matrices/matA"; + //argv[2] = "matrices/matB"; + + uint64_t start, end; + + // Matrix 1 + FILE* input1 = fopen(argv[1], "r"); + fscanf(input1, "%d", &rows); + fscanf(input1, "%d", &cols); + matrix1 = (int *)malloc(rows*cols*sizeof(int)); + for(int i = 0; i < rows*cols; i++) { + int value; + fscanf(input1, "%d", &value); + matrix1[i] = value; + } + fclose(input1); + + // Matrix 2 + FILE* input2 = fopen(argv[2], "r"); + fscanf(input2, "%d", &rows); + fscanf(input2, "%d", &cols); + + matrix2 = (int *)malloc(rows*cols*sizeof(int)); + for(int i = 0; i < rows*cols; i++) { + int value; + fscanf(input2, "%d", &value); + matrix2[i] = value; + } + fclose(input2); + + result = (int *)malloc(rows*cols*sizeof(int)); + + // Threading functionality + + start = gettime_ns(); + + if(OPS >= CORE) { + pthread_t threads[CORE]; + int remainder = (OPS) % CORE; + // Create threads + for (int i = 0; i < CORE; i++) { + int* a = malloc(sizeof(int)); + *a = i; + if (pthread_create(&threads[i], NULL, addition, a)) { + perror("Error creating thread\n"); + return 1; + } + } + // Wait for threads + for (int i = 0; i < CORE; i++) { + if (pthread_join(threads[i], NULL)) { + perror("Error joining thread\n"); + return 1; + } + } + // Add remaining elements + if(remainder != 0) { + for (int i = (OPS); i < (OPS)+remainder; i++) { + result[i] = matrix1[i] + matrix2[i]; + } + } + } else { + for (int i = OPS; i < OPS; i++) { + result[i] = matrix1[i] + matrix2[i]; + } + } + + end = gettime_ns(); + + // Print result to console + for (int i = 0; i < rows * cols; i++) { + printf("%2d ", result[i]); + if ((i + 1) % cols == 0) { + printf("\n"); + } + } + + printf("Addition took %" PRIu64 " nanoseconds\n", end - start); + + free(matrix1); + free(matrix2); + free(result); +} \ No newline at end of file diff --git a/04-MatrixAddition (pthread)/matAddThread2 b/04-MatrixAddition (pthread)/matAddThread2 new file mode 100644 index 0000000000000000000000000000000000000000..3b40ef695c92be484c0948f8322cc7b806d69cf2 GIT binary patch literal 21216 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 +#include +#include + +#define NUM_THREADS 4 + +int *matrix1; +int *matrix2; +int *result; +int num_rows; +int num_cols; + +void *matrix_addition(void *arg) { + int thread_id = *(int *)arg; + int i, j; + for (i = thread_id; i < num_rows; i += NUM_THREADS) { + for (j = 0; j < num_cols; j++) { + int index = i * num_cols + j; + result[index] = matrix1[index] + matrix2[index]; + } + } + pthread_exit(NULL); +} + +int main() { + int i, j; + num_rows = 3; + num_cols = 3; + + // Allocate memory for matrices + matrix1 = malloc(num_rows * num_cols * sizeof(int)); + matrix2 = malloc(num_rows * num_cols * sizeof(int)); + result = malloc(num_rows * num_cols * sizeof(int)); + + // Initialize matrices + for (i = 0; i < num_rows; i++) { + for (j = 0; j < num_cols; j++) { + int index = i * num_cols + j; + matrix1[index] = rand() % 10; + matrix2[index] = rand() % 10; + } + } + + // Create threads + pthread_t threads[NUM_THREADS]; + int thread_ids[NUM_THREADS]; + for (i = 0; i < NUM_THREADS; i++) { + thread_ids[i] = i; + pthread_create(&threads[i], NULL, matrix_addition, &thread_ids[i]); + } + + // Join threads + for (i = 0; i < NUM_THREADS; i++) { + pthread_join(threads[i], NULL); + } + + // Print result matrix + printf("Result matrix:\n"); + for (i = 0; i < num_rows; i++) { + for (j = 0; j < num_cols; j++) { + printf("%d ", result[i * num_cols + j]); + } + printf("\n"); + } + + // Free memory + free(matrix1); + free(matrix2); + free(result); + + return 0; +} diff --git a/CS3841.code-workspace b/CS3841.code-workspace index 77c9d77..da569bc 100644 --- a/CS3841.code-workspace +++ b/CS3841.code-workspace @@ -10,7 +10,8 @@ "mataddsingle": "c", "stdint.h": "c", "inttypes.h": "c", - "wait.h": "c" + "wait.h": "c", + "stdlib.h": "c" } } } \ No newline at end of file