色另类_婷婷激情四月_亚洲精品无码不卡在线播放he_欧美第七页_精品国产综合区久久久久99_青娱乐极品盛宴在线

產品分類

當前位置: 首頁 > 傳感測量產品 > 工業傳感器 > 溫濕度傳感器

類型分類:
科普知識
數據分類:
溫濕度傳感器

ESM6802( iMX6-WEC7)多核性能測試

發布日期:2022-04-26 點擊率:94

  • 關鍵詞:                                                                ESM6802                                                                iMX6-WEC7

  • 摘要:WEC7一個最重要的特性就是對多核處理器的支持(Symmetric Multi-Processing(SMP)),下面將通過應用程序來測試在單核和多核情況下系統的執行情況,為了更直觀的比較,同時參與測試的還有ESM3354,ESM3354是基于TI Coertex-A8處理器的工控主板,CPU主頻1GHz,同樣預裝WEC7操作系統。


  ESM6802是英創公司推出的基于Freescale i.MX6DL雙核處理器(ARM Cortex-A9,主頻1GHz)的高性能工控主板,預裝正版Windows Embedded Compact 7(WEC7)嵌入式操作系統,WEC7一個最重要的特性就是對多核處理器的支持(Symmetric Multi-Processing(SMP)),下面將通過應用程序來測試在單核和多核情況下系統的執行情況,為了更直觀的比較,同時參與測試的還有ESM3354,ESM3354是基于TI Coertex-A8處理器的工控主板,CPU主頻1GHz,同樣預裝WEC7操作系統。


  所設計的測試程序代碼如下,其中的TestSmp函數有兩個輸入參數,第一參數表示要創建測試線程的數量,第二個參數為所創建線程的運行時長。cbTestSmp是被創建的測試線程,測試線程主要是在一個while循環中,反復讀取內存變量然后與預設值進行比較,在運行設定的時間后自動退出循環,其中的threadParam->loops變量會記錄下while循環總共執行的次數。


  typedef struct _SMP_THREAD_PARAM

  {

      UINT32 durationMs;

      UINT32 threadId;

      UINT64 loops;

      BOOL   bSetAffinity;

      UINT32 sandBoxSize;

      LPVOID sandBoxStart;

  }SMP_THREAD_PARAM, *PSMP_THREAD_PARAM;


  ULONG cbTestSmp(LPVOID param)

  {

      PSMP_THREAD_PARAM threadParam = (PSMP_THREAD_PARAM)param;

      DWORD tStart = GetTickCount();

      UINT8 *buffer = (UINT8 *)threadParam->sandBoxStart;


      wprintf(L"Ahou, Thread %d, running for %d ms ", threadParam->threadId,

           threadParam->durationMs);


      // Write to sandbox

      for (UINT32 i = 0; i < threadParam->sandBoxSize; i++)

      {

          buffer[i] = (UINT8)(i);

      }


      while ( (GetTickCount() - tStart) < threadParam->durationMs)

      {

          // Read back from sandbox

          for (UINT32 i = 0; i < threadParam->sandBoxSize; i++)

          {

              if (buffer[i] != (UINT8)(i))

              {

                  wprintf(L"Thread %d : error at byte %d for loop %I64d !! ",

                      threadParam->threadId, i, threadParam->loops);

              }          

          }      


          threadParam->loops++;

      }


      wprintf(L"Thread %d : terminating ", threadParam->threadId);

 

     return 0;

  }


  void TestSmp(UINT32 nNumOfThread, UINT32 durationMs)

  {

      UINT32 i;


      PSMP_THREAD_PARAM threadParams;

      HANDLE *threadHandles;

      UINT64 totalLoops = 0;

      UINT32 sandBoxSize = 1024 * 128; // 128 kB


      HANDLE h_array[1];


      threadParams = (PSMP_THREAD_PARAM)malloc(nNumOfThread * sizeof(SMP_THREAD_PARAM));


      if (threadParams == NULL)

      {

          wprintf(L"Failed allocating thread params ! ");

          return;

      }


      threadHandles = (HANDLE *)malloc(nNumOfThread * sizeof(HANDLE));


     if (threadHandles == NULL)

      {

          wprintf(L"Failed allocating thread handles ! ");

          return;

      }


      for (i = 0; i < nNumOfThread; i++)

      {

          threadParams[i].bSetAffinity = TRUE;

          threadParams[i].threadId = i;

          threadParams[i].durationMs = durationMs;

          threadParams[i].loops = 0;

          threadParams[i].sandBoxSize = sandBoxSize;

          threadParams[i].sandBoxStart = malloc(sandBoxSize);

          threadHandles[i] = CreateThread(NULL, 0, cbTestSmp, &threadParams[i], 0, NULL);

          wprintf(L"Thread handle %d : 0x%x ", i, threadHandles[i]);

      }


      h_array[0] = threadHandles[0];

      DWORD res = WaitForSingleObject(h_array[0], INFINITE);


      Sleep(500);


      if (res == WAIT_TIMEOUT)

      {

          wprintf(L"Timeout waiting for threads ! ");

      }

      else

      {

          wprintf(L"All threads exited ");

      }


      for (i = 0; i < nNumOfThread; i++)

      {

         wprintf(L"Thread %d did run %I64d loops ", i, threadParams[i].loops);

          totalLoops += threadParams[i].loops;

          free(threadParams[i].sandBoxStart);

          CloseHandle(threadHandles[i]);

      }


      wprintf(L"Total number of loops %I64d (%I64d millions) ", totalLoops,

          totalLoops / 1000000);


      free(threadHandles);

      free(threadParams);

  }


  將上述測試代碼編譯生成為exe文件,分別在ESM3354和ESM6802上運行,設置while循環的執行時間均為10000ms,測試結果如下:


1、創建單個線程


測試主板與線程ESM3354(1GHz單核 Cortex-A8)ESM6802(1GHz雙核Cortex-A9)

 循環次數67917493


  當測試程序只創建一個測試線程時,ESM3354的while循環執行了6791次,ESM6802執行7493次,雖然ESM6802為雙核處理器,但由于程序只有一個線程,即同一時刻只有一個線程在運行,所以在相同的時間內,循環的次數僅略多于ESM3354。由于ESM3354和ESM6802的CPU主頻同樣都是1GHz,所以可以認為ESM6802多出的循環次數也就是Cortex-A8與Cortex-A9在代碼執行效率上的差別。


2、創建兩個線程


測試主板與線程ESM3354(1GHz單核 Cortex-A8)ESM6802(1GHz雙核Cortex-A9)

 線程1循環次數33907438

 線程2循環次數34427452

 總循環次數683214890


  當測試程序創建了兩個線程時,ESM3354會將CPU資源大約平均的分配給兩個線程,如上表中線程1執行了3390次,線程2執行了3442次,兩個線程總共執行的次數與只創建單個線程測試時的循環次數相當。ESM6802為雙核CPU,在測試程序有兩個線程的情況下,在同一時刻兩個線程可以同時運行,所以總的循環次數大約是單個線程測試時的兩倍。


  通過上面的測試可以看到,在多線程情況下,如果操作系統支持多核處理器,那么雙核CPU的運算能力將是單核CPU的兩倍。


下一篇: PLC、DCS、FCS三大控

上一篇: 索爾維全系列Solef?PV

推薦產品

更多
主站蜘蛛池模板: 一级黄色播放 | 五月网站| 日韩亚洲一区二区三区 | 国产精品人妻无码久久久郑州 | 国产精品1 | 一级片九九 | 一区二区免费看 | 欧美伦理一区 | 国产精品拍拍拍福利在线观看 | 潘金莲强完整版 | 国产视频三区 | 亚洲美女亚洲精品久久久久 | 国产精品国产三级国产播12软件 | 91精品国产综合久久青草 | 亚洲偷图色综合色就色 | 日日干夜夜拍 | 亚洲视频一区在线观看 | 国产精品爱啪在线线免费观看 | 亚洲国产日韩欧美高清片a 高清视频在线播放 | 国产福利视频在线观看 | 色综合天天色综合 | jizz视频| 福利入口在线观看 | 免费成人高清 | 国产精品视频免费观看 | 5252sese| 一本一本久久α久久精品66 | 亚洲综合视频一区 | 欧美综合一区二区三区 | 天天干天天碰 | 国产69精品久久久久99尤物 | a免费国产一级特黄aa大 | 日韩不卡一区二区 | 日韩一二三区视频 | 性色成人网 | 久久久久久久99精品免费观看 | 日韩视频中文字幕 | 可以看av的网站 | 波多野结衣一区二区三区 | 欧美一级久久久久久久大片 | 日韩 欧美 亚洲国产 |