我正在嘗試將矩陣處理程序並列。使用OpenMP後,我決定還檢查了CilkPlus,我注意到以下幾點:爲什麼CILK_NWORKERS隻影響一個cilk_spawn程序?
在我的C代碼,我只在一個部分,即適用於並行:
//(test_function declarations)
cilk_spawn highPrep(d, x, half);
d = temp_0;
r = malloc(sizeof(int)*(half));
temp_1 = r;
x = x_alloc + F_EXTPAD;
lowPrep(r, d, x, half);
cilk_sync;
//test_function return
根據該文件至今我已閱讀,希望cilk_spawn -maybe-(CilkPlus不強制並行性)採用highPrep()函數,並在一個可用的硬件線程中執行它,然後繼續執行其餘代碼,包括函數lowPrep()。然後線程應該在cilk_sync中同步,然後執行其餘的代碼。
我在8core/16thread Xeon E5-2680上運行該程序,除了我的實驗外,它在任何給定時間都不執行任何其他操作。我現在的問題是,我注意到當我更改環境變量CILK_NWORKERS並嘗試諸如2,4,8,16等值時,test_function需要執行的時間隨着變化而變化。特別是,CILK_NWORKERS設置得越高(2之後),函數變得越慢。這似乎對我來說很直觀,因爲我期望可用的線程數量不會改變cilk_spawn的操作。我期望如果2個線程可用,那麼函數highPrep在另一個線程上執行。任何超過2個線程,我預計會保持閒置。
的highPrep和lowPrep功能是:
void lowPrep(int *dest, int *src1, int *src2, int size)
{
double temp;
int i;
for(i = 0; i < size; i++)
{
temp = -.25 * (src1[i] + src1[i + 1]) + .5;
if (temp > 0)
temp = (int)temp;
else
{
if (temp != (int)temp)
temp = (int)(temp - 1);
}
dest[i] = src2[2*i] - (int)(temp);
}
}
void highPrep(int *dest, int *src, int size)
{
double temp;
int i;
for(i=0; i < size + 1; i++)
{
temp = (-1.0/16 * (src[-4 + 2*i] + src[2 + 2*i]) + 9.0/16 * (src[-2 + 2*i] + src[0 + 2*i]) + 0.5);
if (temp > 0)
temp = (int)temp;
else
{
if (temp != (int)temp)
temp = (int)(temp - 1);
}
dest[i] = src[-1 + 2*i] - (int)temp;
}
}
必須有這背後一個合理的解釋,這是合理的預期不同的執行時間這樣的計劃?
偉大的分析。對英特爾CilkPlus論壇上的同一問題也給出了更簡短的解釋:https://software.intel.com/zh-cn/forums/topic/531848#comment-1799372 「」空閒「工作人員沒有空閒。他們正在尋找工作要做,應該讓你忙碌的工人進入。「 – koukouviou 2014-09-25 16:29:03