xref: /isa-l_crypto/sha256_mb/sha256_mb_vs_ossl_perf.c (revision 487b772bd076f8313189acea961fedffe88eec4b)
16df3ef80SGreg Tucker /**********************************************************************
26df3ef80SGreg Tucker   Copyright(c) 2011-2016 Intel Corporation All rights reserved.
36df3ef80SGreg Tucker 
46df3ef80SGreg Tucker   Redistribution and use in source and binary forms, with or without
56df3ef80SGreg Tucker   modification, are permitted provided that the following conditions
66df3ef80SGreg Tucker   are met:
76df3ef80SGreg Tucker     * Redistributions of source code must retain the above copyright
86df3ef80SGreg Tucker       notice, this list of conditions and the following disclaimer.
96df3ef80SGreg Tucker     * Redistributions in binary form must reproduce the above copyright
106df3ef80SGreg Tucker       notice, this list of conditions and the following disclaimer in
116df3ef80SGreg Tucker       the documentation and/or other materials provided with the
126df3ef80SGreg Tucker       distribution.
136df3ef80SGreg Tucker     * Neither the name of Intel Corporation nor the names of its
146df3ef80SGreg Tucker       contributors may be used to endorse or promote products derived
156df3ef80SGreg Tucker       from this software without specific prior written permission.
166df3ef80SGreg Tucker 
176df3ef80SGreg Tucker   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
186df3ef80SGreg Tucker   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
196df3ef80SGreg Tucker   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
206df3ef80SGreg Tucker   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
216df3ef80SGreg Tucker   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
226df3ef80SGreg Tucker   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
236df3ef80SGreg Tucker   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
246df3ef80SGreg Tucker   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
256df3ef80SGreg Tucker   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
266df3ef80SGreg Tucker   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
276df3ef80SGreg Tucker   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
286df3ef80SGreg Tucker **********************************************************************/
296df3ef80SGreg Tucker 
306df3ef80SGreg Tucker #include <stdio.h>
316df3ef80SGreg Tucker #include <stdlib.h>
326df3ef80SGreg Tucker #include <openssl/sha.h>
336df3ef80SGreg Tucker #include "sha256_mb.h"
346df3ef80SGreg Tucker #include "test.h"
356df3ef80SGreg Tucker 
366df3ef80SGreg Tucker // Set number of outstanding jobs
376df3ef80SGreg Tucker #define TEST_BUFS 32
386df3ef80SGreg Tucker 
39dabcf587SGreg Tucker #ifndef GT_L3_CACHE
40dabcf587SGreg Tucker #define GT_L3_CACHE 32 * 1024 * 1024 /* some number > last level cache */
41dabcf587SGreg Tucker #endif
42dabcf587SGreg Tucker 
43dabcf587SGreg Tucker #if !defined(COLD_TEST) && !defined(TEST_CUSTOM)
44dabcf587SGreg Tucker // Cached test, loop many times over small dataset
456df3ef80SGreg Tucker #define TEST_LEN      4 * 1024
466df3ef80SGreg Tucker #define TEST_LOOPS    4000
476df3ef80SGreg Tucker #define TEST_TYPE_STR "_warm"
48dabcf587SGreg Tucker #elif defined(COLD_TEST)
496df3ef80SGreg Tucker // Uncached test.  Pull from large mem base.
506df3ef80SGreg Tucker #define TEST_LEN      (GT_L3_CACHE / TEST_BUFS)
516df3ef80SGreg Tucker #define TEST_LOOPS    20
526df3ef80SGreg Tucker #define TEST_TYPE_STR "_cold"
536df3ef80SGreg Tucker #endif
546df3ef80SGreg Tucker 
556df3ef80SGreg Tucker #define TEST_MEM TEST_LEN *TEST_BUFS *TEST_LOOPS
566df3ef80SGreg Tucker 
576df3ef80SGreg Tucker /* Reference digest global to reduce stack usage */
580a437795SPablo de Lara static uint8_t digest_ssl[TEST_BUFS][4 * ISAL_SHA256_DIGEST_NWORDS];
596df3ef80SGreg Tucker 
609ba6f238SMarcel Cornu int
main(void)619ba6f238SMarcel Cornu main(void)
626df3ef80SGreg Tucker {
630a437795SPablo de Lara         ISAL_SHA256_HASH_CTX_MGR *mgr = NULL;
64*487b772bSPablo de Lara         ISAL_SHA256_HASH_CTX ctxpool[TEST_BUFS], *ctx = NULL;
656df3ef80SGreg Tucker         unsigned char *bufs[TEST_BUFS];
666df3ef80SGreg Tucker         uint32_t i, j, t, fail = 0;
676df3ef80SGreg Tucker         struct perf start, stop;
686df3ef80SGreg Tucker 
696df3ef80SGreg Tucker         for (i = 0; i < TEST_BUFS; i++) {
706df3ef80SGreg Tucker                 bufs[i] = (unsigned char *) calloc((size_t) TEST_LEN, 1);
716df3ef80SGreg Tucker                 if (bufs[i] == NULL) {
726df3ef80SGreg Tucker                         printf("calloc failed test aborted\n");
736df3ef80SGreg Tucker                         return 1;
746df3ef80SGreg Tucker                 }
756df3ef80SGreg Tucker                 // Init ctx contents
768cb7fe78SPablo de Lara                 isal_hash_ctx_init(&ctxpool[i]);
776df3ef80SGreg Tucker                 ctxpool[i].user_data = (void *) ((uint64_t) i);
786df3ef80SGreg Tucker         }
796df3ef80SGreg Tucker 
800a437795SPablo de Lara         int ret = posix_memalign((void *) &mgr, 16, sizeof(ISAL_SHA256_HASH_CTX_MGR));
81c4c62395SJerry Yu         if (ret) {
82c4c62395SJerry Yu                 printf("alloc error: Fail");
83c4c62395SJerry Yu                 return -1;
84c4c62395SJerry Yu         }
85*487b772bSPablo de Lara         ret = isal_sha256_ctx_mgr_init(mgr);
86*487b772bSPablo de Lara         if (ret)
87*487b772bSPablo de Lara                 return 1;
886df3ef80SGreg Tucker 
896df3ef80SGreg Tucker         // Start OpenSSL tests
906df3ef80SGreg Tucker         perf_start(&start);
916df3ef80SGreg Tucker         for (t = 0; t < TEST_LOOPS; t++) {
926df3ef80SGreg Tucker                 for (i = 0; i < TEST_BUFS; i++)
936df3ef80SGreg Tucker                         SHA256(bufs[i], TEST_LEN, digest_ssl[i]);
946df3ef80SGreg Tucker         }
956df3ef80SGreg Tucker         perf_stop(&stop);
966df3ef80SGreg Tucker 
976df3ef80SGreg Tucker         printf("sha256_openssl" TEST_TYPE_STR ": ");
986df3ef80SGreg Tucker         perf_print(stop, start, (long long) TEST_LEN * i * t);
996df3ef80SGreg Tucker 
1006df3ef80SGreg Tucker         // Start mb tests
1016df3ef80SGreg Tucker         perf_start(&start);
1026df3ef80SGreg Tucker         for (t = 0; t < TEST_LOOPS; t++) {
103*487b772bSPablo de Lara                 for (i = 0; i < TEST_BUFS; i++) {
104*487b772bSPablo de Lara                         ret = isal_sha256_ctx_mgr_submit(mgr, &ctxpool[i], &ctx, bufs[i], TEST_LEN,
1058cb7fe78SPablo de Lara                                                          ISAL_HASH_ENTIRE);
106*487b772bSPablo de Lara                         if (ret)
107*487b772bSPablo de Lara                                 return 1;
108*487b772bSPablo de Lara                 }
1096df3ef80SGreg Tucker 
110*487b772bSPablo de Lara                 do {
111*487b772bSPablo de Lara                         ret = isal_sha256_ctx_mgr_flush(mgr, &ctx);
112*487b772bSPablo de Lara                         if (ret)
113*487b772bSPablo de Lara                                 return 1;
114*487b772bSPablo de Lara                 } while (ctx != NULL);
1156df3ef80SGreg Tucker         }
1166df3ef80SGreg Tucker         perf_stop(&stop);
1176df3ef80SGreg Tucker 
1186df3ef80SGreg Tucker         printf("multibinary_sha256" TEST_TYPE_STR ": ");
1196df3ef80SGreg Tucker         perf_print(stop, start, (long long) TEST_LEN * i * t);
1206df3ef80SGreg Tucker 
1216df3ef80SGreg Tucker         for (i = 0; i < TEST_BUFS; i++) {
1220a437795SPablo de Lara                 for (j = 0; j < ISAL_SHA256_DIGEST_NWORDS; j++) {
1236df3ef80SGreg Tucker                         if (ctxpool[i].job.result_digest[j] !=
124e3f7d4fbSUlrich Weigand                             to_be32(((uint32_t *) digest_ssl[i])[j])) {
1256df3ef80SGreg Tucker                                 fail++;
1269ba6f238SMarcel Cornu                                 printf("Test%d, digest%d fail %08X <=> %08X\n", i, j,
1279ba6f238SMarcel Cornu                                        ctxpool[i].job.result_digest[j],
128e3f7d4fbSUlrich Weigand                                        to_be32(((uint32_t *) digest_ssl[i])[j]));
1296df3ef80SGreg Tucker                         }
1306df3ef80SGreg Tucker                 }
1316df3ef80SGreg Tucker         }
1326df3ef80SGreg Tucker 
1336df3ef80SGreg Tucker         printf("Multi-buffer sha256 test complete %d buffers of %d B with "
1349ba6f238SMarcel Cornu                "%d iterations\n",
1359ba6f238SMarcel Cornu                TEST_BUFS, TEST_LEN, TEST_LOOPS);
1366df3ef80SGreg Tucker 
1376df3ef80SGreg Tucker         if (fail)
1386df3ef80SGreg Tucker                 printf("Test failed function check %d\n", fail);
1396df3ef80SGreg Tucker         else
1406df3ef80SGreg Tucker                 printf(" multibinary_sha256_ossl_perf: Pass\n");
1416df3ef80SGreg Tucker 
1426df3ef80SGreg Tucker         return fail;
1436df3ef80SGreg Tucker }
144