{"body":"#include <stdio.h>\n#include <esp_attr.h>\n#include <esp_timer.h>\n#include <freertos/FreeRTOS.h>\n#include <freertos/task.h>\n#include \"riscv/rv_utils.h\"\n\nstatic double tv[8];\nconst int N = 3200000;\n\n#ifndef CSR_MINSTRET\n#define CSR_MINSTRET 0xb02\n#endif\n\n#define TEST(type,name,ops) void IRAM_ATTR name (void) {\\\n    type f0 = tv[0],f1 = tv[1],f2 = tv[2],f3 = tv[3];\\\n    type f4 = tv[4],f5 = tv[5],f6 = tv[6],f7 = tv[7];\\\n    for (int j = 0; j < N/16; j++) {\\\n        ops \\\n    }\\\n    tv[0] = f0;tv[1] = f1;tv[2] = f2;tv[3] = f3;\\\n    tv[4] = f4;tv[5] = f5;tv[6] = f6;tv[7] = f7;\\\n    }\n    \n#define fops(op1,op2) f0 op1##=f1 op2 f2;f1 op1##=f2 op2 f3;\\\n    f2 op1##=f3 op2 f4;f3 op1##=f4 op2 f5;\\\n    f4 op1##=f5 op2 f6;f5 op1##=f6 op2 f7;\\\n    f6 op1##=f7 op2 f0;f7 op1##=f0 op2 f1;\n\n#define addops fops(,+) fops(,+)\n#define divops fops(,/) fops(,/)\n#define mulops fops(,*) fops(,*)\n#define muladdops fops(+,*)\n\nTEST(int,mulint,mulops)\nTEST(float,mulfloat,mulops)\nTEST(double,muldouble,mulops)\nTEST(int,addint,addops)\nTEST(float,addfloat,addops)\nTEST(double,adddouble,addops)\nTEST(int,divint,divops)\nTEST(float,divfloat,divops)\nTEST(double,divdouble,divops)\nTEST(int,muladdint,muladdops)\nTEST(float,muladdfloat,muladdops)\nTEST(double,muladddouble,muladdops)\n\nvoid timeit(char *name,void fn(void)) {\n    vTaskDelay(1);\n    tv[0]=tv[1]=tv[2]=tv[3]=tv[4]=tv[5]=tv[6]=tv[7]=1;\n    // get time since boot in microseconds\n    uint64_t time=esp_timer_get_time();\n    unsigned ccount,icount,ccount_new,icount_new;\n    ccount = rv_utils_get_cycle_count();\n    icount = RV_READ_CSR(CSR_MINSTRET);\n    fn();\n    ccount_new = rv_utils_get_cycle_count();\n    icount_new = RV_READ_CSR(CSR_MINSTRET);\n    time=esp_timer_get_time()-time;\n    float cpi=(float)(ccount_new-ccount)/(icount_new-icount);\n    printf (\"%s \\t %f MOP/S   \\tCPI=%f\\n\",name, (float)N/time,cpi);\n}\n\nvoid app_main() {\n    timeit(\"Integer Addition\",addint);\n    timeit(\"Integer Multiply\",mulint);\n    timeit(\"Integer Division\",divint);\n    timeit(\"Integer Multiply-Add\",muladdint);\n\n    timeit(\"Float Addition \", addfloat);\n    timeit(\"Float Multiply \", mulfloat);\n    timeit(\"Float Division \", divfloat);\n    timeit(\"Float Multiply-Add\", muladdfloat);\n\n    timeit(\"Double Addition\", adddouble);\n    timeit(\"Double Multiply\", muldouble);\n    timeit(\"Double Division\", divdouble);\n    timeit(\"Double Multiply-Add\", muladddouble);\n}","name":"esp-benchmarks.c","extension":"c","url":"https://www.irccloud.com/pastebin/2QIVtFeZ/esp-benchmarks.c","modified":1722377113,"id":"2QIVtFeZ","size":2384,"lines":79,"own_paste":false,"theme":"","date":1722377113}