ESM6802是英創(chuàng)公司推出的基于Freescale i.MX6DL雙核處理器(ARM Cortex-A9,主頻1GHz)的高性能工控主板,預(yù)裝正版Windows Embedded Compact 7(WEC7)嵌入式操作系統(tǒng),WEC7一個(gè)最重要的特性就是對(duì)多核處理器的支持(Symmetric Multi-Processing(SMP)),下面將通過應(yīng)用程序來測試在單核和多核情況下系統(tǒng)的執(zhí)行情況,為了更直觀的比較,同時(shí)參與測試的還有ESM3354,ESM3354是基于TI Coertex-A8處理器的工控主板,CPU主頻1GHz,同樣預(yù)裝WEC7操作系統(tǒng)。
所設(shè)計(jì)的測試程序代碼如下,其中的TestSmp函數(shù)有兩個(gè)輸入?yún)?shù),第一參數(shù)表示要?jiǎng)?chuàng)建測試線程的數(shù)量,第二個(gè)參數(shù)為所創(chuàng)建線程的運(yùn)行時(shí)長。cbTestSmp是被創(chuàng)建的測試線程,測試線程主要是在一個(gè)while循環(huán)中,反復(fù)讀取內(nèi)存變量然后與預(yù)設(shè)值進(jìn)行比較,在運(yùn)行設(shè)定的時(shí)間后自動(dòng)退出循環(huán),其中的threadParam->loops變量會(huì)記錄下while循環(huán)總共執(zhí)行的次數(shù)。
typedefstruct_SMP_THREAD_PARAM
{
UINT32 durationMs;
UINT32 threadId;
UINT64 loops;
BOOL bSetAffinity;
UINT32 sandBoxSize;
LPVOID sandBoxStart;
}SMP_THREAD_PARAM, *PSMP_THREAD_PARAM;
ULONGcbTestSmp(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\r\n", 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 !!\r\n",
threadParam->threadId, i, threadParam->loops);
}
}
threadParam->loops++;
}
wprintf(L"Thread %d : terminating\r\n", threadParam->threadId);
return0;
}
voidTestSmp(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 !\r\n");
return;
}
threadHandles = (HANDLE *)malloc(nNumOfThread *sizeof(HANDLE));
if(threadHandles == NULL)
{
wprintf(L"Failed allocating thread handles !\r\n");
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\r\n", 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 !\r\n");
}
else
{
wprintf(L"All threads exited\r\n");
}
for(i = 0; i < nNumOfThread; i++)
{
wprintf(L"Thread %d did run %I64d loops\r\n", i, threadParams[i].loops);
totalLoops += threadParams[i].loops;
free(threadParams[i].sandBoxStart);
CloseHandle(threadHandles[i]);
}
wprintf(L"Total number of loops %I64d (%I64d millions)\r\n", totalLoops,
totalLoops / 1000000);
free(threadHandles);
free(threadParams);
}
將上述測試代碼編譯生成為exe文件,分別在ESM3354和ESM6802上運(yùn)行,設(shè)置while循環(huán)的執(zhí)行時(shí)間均為10000ms,測試結(jié)果如下:
1、創(chuàng)建單個(gè)線程
測試主板與線程 | ESM3354(1GHz單核 Cortex-A8) | ESM6802(1GHz雙核Cortex-A9) |
循環(huán)次數(shù) | 6791 | 7493 |
當(dāng)測試程序只創(chuàng)建一個(gè)測試線程時(shí),ESM3354的while循環(huán)執(zhí)行了6791次,ESM6802執(zhí)行7493次,雖然ESM6802為雙核處理器,但由于程序只有一個(gè)線程,即同一時(shí)刻只有一個(gè)線程在運(yùn)行,所以在相同的時(shí)間內(nèi),循環(huán)的次數(shù)僅略多于ESM3354。由于ESM3354和ESM6802的CPU主頻同樣都是1GHz,所以可以認(rèn)為ESM6802多出的循環(huán)次數(shù)也就是Cortex-A8與Cortex-A9在代碼執(zhí)行效率上的差別。
2、創(chuàng)建兩個(gè)線程
測試主板與線程 | ESM3354(1GHz單核 Cortex-A8) | ESM6802(1GHz雙核Cortex-A9) |
線程1循環(huán)次數(shù) | 3390 | 7438 |
線程2循環(huán)次數(shù) | 3442 | 7452 |
總循環(huán)次數(shù) | 6832 | 14890 |
當(dāng)測試程序創(chuàng)建了兩個(gè)線程時(shí),ESM3354會(huì)將CPU資源大約平均的分配給兩個(gè)線程,如上表中線程1執(zhí)行了3390次,線程2執(zhí)行了3442次,兩個(gè)線程總共執(zhí)行的次數(shù)與只創(chuàng)建單個(gè)線程測試時(shí)的循環(huán)次數(shù)相當(dāng)。ESM6802為雙核CPU,在測試程序有兩個(gè)線程的情況下,在同一時(shí)刻兩個(gè)線程可以同時(shí)運(yùn)行,所以總的循環(huán)次數(shù)大約是單個(gè)線程測試時(shí)的兩倍。
通過上面的測試可以看到,在多線程情況下,如果操作系統(tǒng)支持多核處理器,那么雙核CPU的運(yùn)算能力將是單核CPU的兩倍。
-
WINDOWS
+關(guān)注
關(guān)注
4文章
3611瀏覽量
91327 -
嵌入式主板
+關(guān)注
關(guān)注
7文章
6100瀏覽量
36264
發(fā)布評(píng)論請(qǐng)先 登錄
中星微技術(shù)斬獲2025金牛科創(chuàng)企業(yè)獎(jiǎng)
科普|信創(chuàng)是什么?一文讀懂“信息技術(shù)應(yīng)用創(chuàng)新”戰(zhàn)略

2025第二屆教育信息技術(shù)應(yīng)用創(chuàng)新大賽正式開賽
龍芯中科榮獲2024年度信息技術(shù)應(yīng)用創(chuàng)新工作委員會(huì)卓越貢獻(xiàn)成員單位
芯盛智能榮獲2024年信息技術(shù)應(yīng)用創(chuàng)新工作委員會(huì)卓越貢獻(xiàn)成員單位
飛騰助力首屆教育信息技術(shù)應(yīng)用創(chuàng)新大賽圓滿落幕
有方科技參編的信息技術(shù)團(tuán)體標(biāo)準(zhǔn)發(fā)布
龍芯中科助力2024首屆教育信息技術(shù)應(yīng)用創(chuàng)新大賽成功舉辦
拓維信息參與牽頭組建!長沙新一代信息技術(shù)產(chǎn)教聯(lián)合體正式獲批

中科創(chuàng)達(dá)榮獲2024年軟件和信息技術(shù)服務(wù)優(yōu)秀企業(yè)
英銳恩科技引領(lǐng)微控制器MCU技術(shù)創(chuàng)新,賦能多元化應(yīng)用!
信創(chuàng)國產(chǎn)化背景下的工控主板發(fā)展現(xiàn)狀
梯度科技入選2023年信息技術(shù)應(yīng)用創(chuàng)新解決方案名單
CPU單核性能與多核性能的區(qū)別
英集芯IP6802:至為芯設(shè)計(jì)的一站式無線充電soc解決方案應(yīng)用芯片

評(píng)論