summaryrefslogtreecommitdiffstats
path: root/src/crypto/isa-l/isa-l_crypto/examples/saturation_test/md5_thread.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/crypto/isa-l/isa-l_crypto/examples/saturation_test/md5_thread.c')
-rw-r--r--src/crypto/isa-l/isa-l_crypto/examples/saturation_test/md5_thread.c213
1 files changed, 213 insertions, 0 deletions
diff --git a/src/crypto/isa-l/isa-l_crypto/examples/saturation_test/md5_thread.c b/src/crypto/isa-l/isa-l_crypto/examples/saturation_test/md5_thread.c
new file mode 100644
index 000000000..f63b3785b
--- /dev/null
+++ b/src/crypto/isa-l/isa-l_crypto/examples/saturation_test/md5_thread.c
@@ -0,0 +1,213 @@
+
+#include <pthread.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <string.h>
+#include <unistd.h>
+#include <openssl/md5.h>
+#include <openssl/sha.h>
+
+#include "isal_multithread_perf.h"
+
+#ifndef HASH_THREAD
+/* MD5 related params and structures*/
+#define DIGEST_NWORDS MD5_DIGEST_NWORDS
+#define MB_BUFS MD5_MAX_LANES
+#define HASH_CTX_MGR MD5_HASH_CTX_MGR
+#define HASH_CTX MD5_HASH_CTX
+
+#define OSSL_THREAD_FUNC md5_ossl_func
+#define OSSL_HASH_FUNC MD5
+#define MB_THREAD_FUNC md5_mb_func
+#define CTX_MGR_INIT md5_ctx_mgr_init
+#define CTX_MGR_SUBMIT md5_ctx_mgr_submit
+#define CTX_MGR_FLUSH md5_ctx_mgr_flush
+
+#define rounds_buf MD5_MAX_LANES
+
+#endif // HASH_THREAD
+
+typedef uint32_t hash_digests[DIGEST_NWORDS];
+
+void *OSSL_THREAD_FUNC(void *arg)
+{
+ int32_t id = *((int *)arg);
+ uint32_t i = 0, j = 0;
+ char *hash_buf[rounds_buf] = { NULL }; /* hash buf is used to do hash compute */
+ char *carry_buf[rounds_buf] = { NULL }; /* carry buf is used to do memory movement */
+ hash_digests digest;
+ uint64_t round = -1;
+ struct timeval start_tv, stop_tv;
+ long long secs = run_secs;
+
+ printfv("Thread %i is started\n", id);
+ /* memory allocate */
+ for (j = 0; j < rounds_buf; j++) {
+ carry_buf[j] = (char *)calloc((size_t)buflen, 1);
+ if (carry_buf[j] == NULL) {
+ printf("calloc failed test aborted\n");
+ goto out;
+ }
+
+ hash_buf[j] = (char *)calloc((size_t)buflen, 1);
+ if (hash_buf[j] == NULL) {
+ printf("calloc failed test aborted\n");
+ goto out;
+ }
+
+ /* Create the random data */
+ for (i = 0; i < buflen; i += 1024) {
+ carry_buf[j][i] = i % 256;
+ hash_buf[j][i] = i % 256;
+ }
+ }
+
+ /* Thread sync */
+ pthread_mutex_lock(&count_lock);
+ count++;
+ if (count == num_threads) {
+ pthread_cond_broadcast(&count_cond);
+ } else {
+ pthread_cond_wait(&count_cond, &count_lock);
+ }
+ pthread_mutex_unlock(&count_lock);
+
+ printfv("Thread %i is ready\n", id);
+ /* hash func starts to run */
+ round = 0;
+ gettimeofday(&start_tv, 0);
+ gettimeofday(&stop_tv, 0);
+ while (secs > (stop_tv.tv_sec - start_tv.tv_sec)) {
+ for (j = 0; j < rounds_buf; j++) {
+ /* Pre mem-operation */
+ if (prememcpy)
+ memcpy(hash_buf[j], carry_buf[j], buflen);
+
+ /* Calculate hash digest */
+ OSSL_HASH_FUNC((char *)hash_buf[j], buflen, (unsigned char *)&digest);
+
+ /* Post mem-operation */
+ if (postmemcpy)
+ memcpy(carry_buf[j], hash_buf[j], buflen);
+ }
+ round++;
+
+ gettimeofday(&stop_tv, 0);
+ }
+ printfv("thread %2i, openssl_func rounds %ld\n", id, round);
+
+ out:
+ for (j = 0; j < rounds_buf; j++) {
+ free(carry_buf[j]);
+ free(hash_buf[j]);
+ }
+
+ pthread_exit((void *)round);
+}
+
+void *MB_THREAD_FUNC(void *arg)
+{
+ int32_t id = *((int *)arg);
+ uint32_t i = 0, j = 0;
+ char *hash_buf[rounds_buf] = { NULL }; /* hash buf is used to do hash compute */
+ char *carry_buf[rounds_buf] = { NULL }; /* carry buf is used to do memory movement */
+ hash_digests *digests[rounds_buf];
+ uint64_t round = -1;
+ struct timeval start_tv, stop_tv;
+ long long secs = run_secs;
+ int ret;
+
+ HASH_CTX_MGR *mgr = NULL;
+ HASH_CTX *ctxpool = NULL, *ctx = NULL;
+
+ printfv("Thread %i is started\n", id);
+ /* Memory allocate */
+ for (j = 0; j < rounds_buf; j++) {
+ carry_buf[j] = (char *)calloc((size_t)buflen, 1);
+ if (carry_buf[j] == NULL) {
+ printf("calloc failed test aborted\n");
+ goto out;
+ }
+
+ hash_buf[j] = (char *)calloc((size_t)buflen, 1);
+ if (hash_buf[j] == NULL) {
+ printf("calloc failed test aborted\n");
+ goto out;
+ }
+
+ digests[j] = (hash_digests *) calloc(sizeof(hash_digests), 1);
+
+ /* Create the random data */
+ for (i = 0; i < buflen; i += 1024) {
+ carry_buf[j][i] = i % 256;
+ hash_buf[j][i] = i % 256;
+ }
+ }
+
+ ctxpool = (HASH_CTX *) calloc(rounds_buf, sizeof(HASH_CTX));
+ for (i = 0; i < rounds_buf; i++) {
+ hash_ctx_init(&ctxpool[i]);
+ ctxpool[i].user_data = (void *)((uint64_t) i);
+ }
+ ret = posix_memalign((void *)&mgr, 16, sizeof(HASH_CTX_MGR));
+ if ((ret != 0) || (mgr == NULL)) {
+ printf("posix_memalign failed test aborted\n");
+ goto out;
+ }
+ CTX_MGR_INIT(mgr);
+
+ printfv("Thread %i gets to wait\n", id);
+ /* Thread sync */
+ pthread_mutex_lock(&count_lock);
+ count++;
+ if (count == num_threads) {
+ pthread_cond_broadcast(&count_cond);
+ } else {
+ pthread_cond_wait(&count_cond, &count_lock);
+ }
+ pthread_mutex_unlock(&count_lock);
+
+ printfv("Thread %i is ready\n", id);
+ /* hash func starts to run */
+ round = 0;
+ gettimeofday(&start_tv, 0);
+ gettimeofday(&stop_tv, 0);
+ while (secs > (stop_tv.tv_sec - start_tv.tv_sec)) {
+ for (j = 0; j < rounds_buf; j += MB_BUFS) {
+ for (i = 0; i < MB_BUFS; i++) {
+ /* Pre mem-operation */
+ if (prememcpy)
+ memcpy(hash_buf[j + i], carry_buf[j + i], buflen);
+
+ CTX_MGR_SUBMIT(mgr, &ctxpool[j + i], hash_buf[j + i], buflen,
+ HASH_ENTIRE);
+ }
+
+ /* Calculate hash digest */
+ while (CTX_MGR_FLUSH(mgr)) ;
+ for (i = 0; i < MB_BUFS; i++) {
+ /* Post mem-operation */
+ if (postmemcpy)
+ memcpy(carry_buf[j + i], hash_buf[j + i], buflen);
+ }
+ }
+ round++;
+
+ gettimeofday(&stop_tv, 0);
+ }
+ printfv("thread %2i, multibuffer_func rounds %ld\n", id, round);
+
+ out:
+ free(ctxpool);
+ free(mgr);
+ for (j = 0; j < rounds_buf; j++) {
+ free(carry_buf[j]);
+ free(digests[j]);
+ free(hash_buf[j]);
+ }
+
+ pthread_exit((void *)round);
+}