產品分類

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

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

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

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

      • 關鍵詞:                                                                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

      推薦產品

      更多
      主站蜘蛛池模板: 无码日韩精品一区二区人妻| 亚洲AV美女一区二区三区| 国产成人久久一区二区三区| 中文字幕在线看视频一区二区三区| 日本亚洲国产一区二区三区| 精品一区二区久久久久久久网站| 久久一区二区三区免费播放| 91精品国产一区| 亚洲av色香蕉一区二区三区蜜桃| 国产精品久久无码一区二区三区网| 婷婷亚洲综合一区二区| 国产精品区AV一区二区| 国产无套精品一区二区 | 亚洲av成人一区二区三区在线播放| 亚洲中文字幕乱码一区| 在线精品日韩一区二区三区| 中文字幕精品亚洲无线码一区应用 | 国产一区二区三区无码免费| 国产精品一区二区三区免费| 亚洲国产精品一区二区第一页| 无码国产精品一区二区免费| 一区在线免费观看| 无码精品黑人一区二区三区| 国产麻豆精品一区二区三区| 国产福利视频一区二区| 亚洲欧美日韩中文字幕一区二区三区 | 精品无码人妻一区二区三区 | 国产中文字幕一区| 中文人妻无码一区二区三区| 亚洲综合激情五月色一区| 视频在线观看一区| 中文字幕视频一区| av在线亚洲欧洲日产一区二区| 精品一区高潮喷吹在线播放| 日本一区二区在线免费观看| 精品一区二区三区四区在线播放| 一区二区三区精品高清视频免费在线播放| 精品国产日产一区二区三区 | 四虎成人精品一区二区免费网站 | 久久免费视频一区| 亚洲AV一区二区三区四区|