xref: /isa-l_crypto/examples/saturation_test/md5_thread.c (revision 8957a389f5d64ee2efc6641cf687254ffa866864)
1acb6d415SXiaodong Liu 
2acb6d415SXiaodong Liu #include <pthread.h>
3acb6d415SXiaodong Liu #include <sys/time.h>
4acb6d415SXiaodong Liu #include <sys/types.h>
5acb6d415SXiaodong Liu #include <stdio.h>
6acb6d415SXiaodong Liu #include <stdlib.h>
7acb6d415SXiaodong Liu #include <stdbool.h>
8acb6d415SXiaodong Liu #include <string.h>
9acb6d415SXiaodong Liu #include <unistd.h>
10883be6dcSPablo de Lara #include <openssl/evp.h>
11acb6d415SXiaodong Liu 
12acb6d415SXiaodong Liu #include "isal_multithread_perf.h"
13acb6d415SXiaodong Liu 
14acb6d415SXiaodong Liu #ifndef HASH_THREAD
15acb6d415SXiaodong Liu /* MD5 related params and structures*/
16*8957a389SPablo de Lara #define DIGEST_NWORDS ISAL_MD5_DIGEST_NWORDS
17*8957a389SPablo de Lara #define MB_BUFS       ISAL_MD5_MAX_LANES
18*8957a389SPablo de Lara #define HASH_CTX_MGR  ISAL_MD5_HASH_CTX_MGR
19*8957a389SPablo de Lara #define HASH_CTX      ISAL_MD5_HASH_CTX
20acb6d415SXiaodong Liu 
21acb6d415SXiaodong Liu #define OSSL_THREAD_FUNC md5_ossl_func
22acb6d415SXiaodong Liu #define MB_THREAD_FUNC   md5_mb_func
23*8957a389SPablo de Lara #define CTX_MGR_INIT     isal_md5_ctx_mgr_init
24*8957a389SPablo de Lara #define CTX_MGR_SUBMIT   isal_md5_ctx_mgr_submit
25*8957a389SPablo de Lara #define CTX_MGR_FLUSH    isal_md5_ctx_mgr_flush
26acb6d415SXiaodong Liu 
27*8957a389SPablo de Lara #define rounds_buf ISAL_MD5_MAX_LANES
28acb6d415SXiaodong Liu 
29acb6d415SXiaodong Liu #endif // HASH_THREAD
30acb6d415SXiaodong Liu 
31acb6d415SXiaodong Liu typedef uint32_t hash_digests[DIGEST_NWORDS];
32acb6d415SXiaodong Liu 
33c280984aSMarcel Cornu void *
OSSL_THREAD_FUNC(void * arg)34c280984aSMarcel Cornu OSSL_THREAD_FUNC(void *arg)
35acb6d415SXiaodong Liu {
36acb6d415SXiaodong Liu         int32_t id = *((int *) arg);
37acb6d415SXiaodong Liu         uint32_t i = 0, j = 0;
38acb6d415SXiaodong Liu         char *hash_buf[rounds_buf] = { NULL };  /* hash buf is used to do hash compute */
39acb6d415SXiaodong Liu         char *carry_buf[rounds_buf] = { NULL }; /* carry buf is used to do memory movement */
40acb6d415SXiaodong Liu         hash_digests digest;
41acb6d415SXiaodong Liu         uint64_t round = -1;
42acb6d415SXiaodong Liu         struct timeval start_tv, stop_tv;
43acb6d415SXiaodong Liu         long long secs = run_secs;
44acb6d415SXiaodong Liu 
45acb6d415SXiaodong Liu         printfv("Thread %i is started\n", id);
46acb6d415SXiaodong Liu         /* memory allocate */
47acb6d415SXiaodong Liu         for (j = 0; j < rounds_buf; j++) {
48acb6d415SXiaodong Liu                 carry_buf[j] = (char *) calloc((size_t) buflen, 1);
49acb6d415SXiaodong Liu                 if (carry_buf[j] == NULL) {
50acb6d415SXiaodong Liu                         printf("calloc failed test aborted\n");
51acb6d415SXiaodong Liu                         goto out;
52acb6d415SXiaodong Liu                 }
53acb6d415SXiaodong Liu 
54acb6d415SXiaodong Liu                 hash_buf[j] = (char *) calloc((size_t) buflen, 1);
55acb6d415SXiaodong Liu                 if (hash_buf[j] == NULL) {
56acb6d415SXiaodong Liu                         printf("calloc failed test aborted\n");
57acb6d415SXiaodong Liu                         goto out;
58acb6d415SXiaodong Liu                 }
59acb6d415SXiaodong Liu 
60acb6d415SXiaodong Liu                 /* Create the random data */
61acb6d415SXiaodong Liu                 for (i = 0; i < buflen; i += 1024) {
62acb6d415SXiaodong Liu                         carry_buf[j][i] = i % 256;
63acb6d415SXiaodong Liu                         hash_buf[j][i] = i % 256;
64acb6d415SXiaodong Liu                 }
65acb6d415SXiaodong Liu         }
66acb6d415SXiaodong Liu 
67883be6dcSPablo de Lara         /* Initialize OpenSSL Ctx */
68883be6dcSPablo de Lara         EVP_MD_CTX *ctx = EVP_MD_CTX_new();
69883be6dcSPablo de Lara 
70acb6d415SXiaodong Liu         /* Thread sync */
71acb6d415SXiaodong Liu         pthread_mutex_lock(&count_lock);
72acb6d415SXiaodong Liu         count++;
73acb6d415SXiaodong Liu         if (count == num_threads) {
74acb6d415SXiaodong Liu                 pthread_cond_broadcast(&count_cond);
75acb6d415SXiaodong Liu         } else {
76acb6d415SXiaodong Liu                 pthread_cond_wait(&count_cond, &count_lock);
77acb6d415SXiaodong Liu         }
78acb6d415SXiaodong Liu         pthread_mutex_unlock(&count_lock);
79acb6d415SXiaodong Liu 
80acb6d415SXiaodong Liu         printfv("Thread %i is ready\n", id);
81acb6d415SXiaodong Liu         /* hash func starts to run */
82acb6d415SXiaodong Liu         round = 0;
83acb6d415SXiaodong Liu         gettimeofday(&start_tv, 0);
84acb6d415SXiaodong Liu         gettimeofday(&stop_tv, 0);
85acb6d415SXiaodong Liu         while (secs > (stop_tv.tv_sec - start_tv.tv_sec)) {
86acb6d415SXiaodong Liu                 for (j = 0; j < rounds_buf; j++) {
87acb6d415SXiaodong Liu                         /* Pre mem-operation */
88acb6d415SXiaodong Liu                         if (prememcpy)
89acb6d415SXiaodong Liu                                 memcpy(hash_buf[j], carry_buf[j], buflen);
90acb6d415SXiaodong Liu 
91acb6d415SXiaodong Liu                         /* Calculate hash digest */
92883be6dcSPablo de Lara                         EVP_DigestInit_ex(ctx, EVP_md5(), NULL);
93883be6dcSPablo de Lara                         EVP_DigestUpdate(ctx, hash_buf[j], buflen);
94883be6dcSPablo de Lara                         EVP_DigestFinal_ex(ctx, (unsigned char *) digest, NULL);
95acb6d415SXiaodong Liu 
96acb6d415SXiaodong Liu                         /* Post mem-operation */
97acb6d415SXiaodong Liu                         if (postmemcpy)
98acb6d415SXiaodong Liu                                 memcpy(carry_buf[j], hash_buf[j], buflen);
99acb6d415SXiaodong Liu                 }
100acb6d415SXiaodong Liu                 round++;
101acb6d415SXiaodong Liu 
102acb6d415SXiaodong Liu                 gettimeofday(&stop_tv, 0);
103acb6d415SXiaodong Liu         }
104acb6d415SXiaodong Liu         printfv("thread %2i, openssl_func rounds %ld\n", id, round);
105acb6d415SXiaodong Liu 
106acb6d415SXiaodong Liu out:
107acb6d415SXiaodong Liu         for (j = 0; j < rounds_buf; j++) {
108acb6d415SXiaodong Liu                 free(carry_buf[j]);
109acb6d415SXiaodong Liu                 free(hash_buf[j]);
110acb6d415SXiaodong Liu         }
111acb6d415SXiaodong Liu 
112883be6dcSPablo de Lara         EVP_MD_CTX_free(ctx);
113acb6d415SXiaodong Liu         pthread_exit((void *) round);
114acb6d415SXiaodong Liu }
115acb6d415SXiaodong Liu 
116c280984aSMarcel Cornu void *
MB_THREAD_FUNC(void * arg)117c280984aSMarcel Cornu MB_THREAD_FUNC(void *arg)
118acb6d415SXiaodong Liu {
119acb6d415SXiaodong Liu         int32_t id = *((int *) arg);
120acb6d415SXiaodong Liu         uint32_t i = 0, j = 0;
121acb6d415SXiaodong Liu         char *hash_buf[rounds_buf] = { NULL };  /* hash buf is used to do hash compute */
122acb6d415SXiaodong Liu         char *carry_buf[rounds_buf] = { NULL }; /* carry buf is used to do memory movement */
123acb6d415SXiaodong Liu         hash_digests *digests[rounds_buf];
124acb6d415SXiaodong Liu         uint64_t round = -1;
125acb6d415SXiaodong Liu         struct timeval start_tv, stop_tv;
126acb6d415SXiaodong Liu         long long secs = run_secs;
127c91caf97STom Cosgrove         int ret;
128acb6d415SXiaodong Liu 
129acb6d415SXiaodong Liu         HASH_CTX_MGR *mgr = NULL;
130acb6d415SXiaodong Liu         HASH_CTX *ctxpool = NULL, *ctx = NULL;
131acb6d415SXiaodong Liu 
132acb6d415SXiaodong Liu         printfv("Thread %i is started\n", id);
133acb6d415SXiaodong Liu         /* Memory allocate */
134acb6d415SXiaodong Liu         for (j = 0; j < rounds_buf; j++) {
135acb6d415SXiaodong Liu                 carry_buf[j] = (char *) calloc((size_t) buflen, 1);
136acb6d415SXiaodong Liu                 if (carry_buf[j] == NULL) {
137acb6d415SXiaodong Liu                         printf("calloc failed test aborted\n");
138acb6d415SXiaodong Liu                         goto out;
139acb6d415SXiaodong Liu                 }
140acb6d415SXiaodong Liu 
141acb6d415SXiaodong Liu                 hash_buf[j] = (char *) calloc((size_t) buflen, 1);
142acb6d415SXiaodong Liu                 if (hash_buf[j] == NULL) {
143acb6d415SXiaodong Liu                         printf("calloc failed test aborted\n");
144acb6d415SXiaodong Liu                         goto out;
145acb6d415SXiaodong Liu                 }
146acb6d415SXiaodong Liu 
147acb6d415SXiaodong Liu                 digests[j] = (hash_digests *) calloc(sizeof(hash_digests), 1);
148acb6d415SXiaodong Liu 
149acb6d415SXiaodong Liu                 /* Create the random data */
150acb6d415SXiaodong Liu                 for (i = 0; i < buflen; i += 1024) {
151acb6d415SXiaodong Liu                         carry_buf[j][i] = i % 256;
152acb6d415SXiaodong Liu                         hash_buf[j][i] = i % 256;
153acb6d415SXiaodong Liu                 }
154acb6d415SXiaodong Liu         }
155acb6d415SXiaodong Liu 
156acb6d415SXiaodong Liu         ctxpool = (HASH_CTX *) calloc(rounds_buf, sizeof(HASH_CTX));
157acb6d415SXiaodong Liu         for (i = 0; i < rounds_buf; i++) {
1588cb7fe78SPablo de Lara                 isal_hash_ctx_init(&ctxpool[i]);
159acb6d415SXiaodong Liu                 ctxpool[i].user_data = (void *) ((uint64_t) i);
160acb6d415SXiaodong Liu         }
161c91caf97STom Cosgrove         ret = posix_memalign((void *) &mgr, 16, sizeof(HASH_CTX_MGR));
162c91caf97STom Cosgrove         if ((ret != 0) || (mgr == NULL)) {
163c91caf97STom Cosgrove                 printf("posix_memalign failed test aborted\n");
164c91caf97STom Cosgrove                 goto out;
165c91caf97STom Cosgrove         }
166*8957a389SPablo de Lara         ret = CTX_MGR_INIT(mgr);
167*8957a389SPablo de Lara         if (ret != 0) {
168*8957a389SPablo de Lara                 printf("MD5 CTX MGR Init failed\n");
169*8957a389SPablo de Lara                 goto out;
170*8957a389SPablo de Lara         }
171acb6d415SXiaodong Liu 
172acb6d415SXiaodong Liu         printfv("Thread %i gets to wait\n", id);
173acb6d415SXiaodong Liu         /* Thread sync */
174acb6d415SXiaodong Liu         pthread_mutex_lock(&count_lock);
175acb6d415SXiaodong Liu         count++;
176acb6d415SXiaodong Liu         if (count == num_threads) {
177acb6d415SXiaodong Liu                 pthread_cond_broadcast(&count_cond);
178acb6d415SXiaodong Liu         } else {
179acb6d415SXiaodong Liu                 pthread_cond_wait(&count_cond, &count_lock);
180acb6d415SXiaodong Liu         }
181acb6d415SXiaodong Liu         pthread_mutex_unlock(&count_lock);
182acb6d415SXiaodong Liu 
183acb6d415SXiaodong Liu         printfv("Thread %i is ready\n", id);
184acb6d415SXiaodong Liu         /* hash func starts to run */
185acb6d415SXiaodong Liu         round = 0;
186acb6d415SXiaodong Liu         gettimeofday(&start_tv, 0);
187acb6d415SXiaodong Liu         gettimeofday(&stop_tv, 0);
188acb6d415SXiaodong Liu         while (secs > (stop_tv.tv_sec - start_tv.tv_sec)) {
189acb6d415SXiaodong Liu                 for (j = 0; j < rounds_buf; j += MB_BUFS) {
190acb6d415SXiaodong Liu                         for (i = 0; i < MB_BUFS; i++) {
191acb6d415SXiaodong Liu                                 /* Pre mem-operation */
192acb6d415SXiaodong Liu                                 if (prememcpy)
193acb6d415SXiaodong Liu                                         memcpy(hash_buf[j + i], carry_buf[j + i], buflen);
194acb6d415SXiaodong Liu 
195*8957a389SPablo de Lara                                 ret = CTX_MGR_SUBMIT(mgr, &ctxpool[j + i], &ctx, hash_buf[j + i],
196*8957a389SPablo de Lara                                                      buflen, ISAL_HASH_ENTIRE);
197*8957a389SPablo de Lara                                 if (ret) {
198*8957a389SPablo de Lara                                         printf("MD5 CTX MGR Submit failed\n");
199*8957a389SPablo de Lara                                         goto out;
200*8957a389SPablo de Lara                                 }
201acb6d415SXiaodong Liu                         }
202acb6d415SXiaodong Liu 
203acb6d415SXiaodong Liu                         /* Calculate hash digest */
204*8957a389SPablo de Lara                         do {
205*8957a389SPablo de Lara                                 ret = CTX_MGR_FLUSH(mgr, &ctx);
206*8957a389SPablo de Lara                                 if (ret) {
207*8957a389SPablo de Lara                                         printf("MD5 CTX MGR Flush failed\n");
208*8957a389SPablo de Lara                                         goto out;
209*8957a389SPablo de Lara                                 }
210*8957a389SPablo de Lara                         } while (ctx != NULL);
211*8957a389SPablo de Lara 
212acb6d415SXiaodong Liu                         for (i = 0; i < MB_BUFS; i++) {
213acb6d415SXiaodong Liu                                 /* Post mem-operation */
214acb6d415SXiaodong Liu                                 if (postmemcpy)
215acb6d415SXiaodong Liu                                         memcpy(carry_buf[j + i], hash_buf[j + i], buflen);
216acb6d415SXiaodong Liu                         }
217acb6d415SXiaodong Liu                 }
218acb6d415SXiaodong Liu                 round++;
219acb6d415SXiaodong Liu 
220acb6d415SXiaodong Liu                 gettimeofday(&stop_tv, 0);
221acb6d415SXiaodong Liu         }
222acb6d415SXiaodong Liu         printfv("thread %2i, multibuffer_func rounds %ld\n", id, round);
223acb6d415SXiaodong Liu 
224acb6d415SXiaodong Liu out:
225acb6d415SXiaodong Liu         free(ctxpool);
226acb6d415SXiaodong Liu         free(mgr);
227acb6d415SXiaodong Liu         for (j = 0; j < rounds_buf; j++) {
228acb6d415SXiaodong Liu                 free(carry_buf[j]);
229acb6d415SXiaodong Liu                 free(digests[j]);
230acb6d415SXiaodong Liu                 free(hash_buf[j]);
231acb6d415SXiaodong Liu         }
232acb6d415SXiaodong Liu 
233acb6d415SXiaodong Liu         pthread_exit((void *) round);
234acb6d415SXiaodong Liu }
235