2011-03-20 80 views
2

我想了解Parallelize []行爲的一些怪癖。並行化行爲

如果我做的:

CloseKernels[]; 
LaunchKernels[1] 
f[n_, g_] := 
    [email protected][ 
    g[Product[Mod[i, 2], {i, 1, n/2}] 
     Product[Mod[i, 2], {i, n/2 + 1, n}]]]; 
Clear[a, b]; 
a = Table[f[i, Identity], {i, 100000, 1500000, 100000}]; 
LaunchKernels[1] 
b = Table[f[i, Parallelize], {i, 100000, 1500000, 100000}]; 
ListLinePlot[{a, b}, PlotStyle -> {Red, Blue}] 

結果是所預期的: enter image description here CPU利用率:

enter image description here

但如果我這樣做,改變功能評價:

CloseKernels[]; 
LaunchKernels[1] 
f[n_, g_] := 
    [email protected][ 
    g[Product[[email protected], {i, 1, n/2}] 
     Product[[email protected], {i, n/2 + 1, n}]]]; 
Clear[a, b]; 
a = Table[f[i, Identity], {i, 1000, 15000, 1000}]; 
LaunchKernels[1] 
b = Table[f[i, Parallelize], {i, 1000, 15000, 1000}]; 
ListLinePlot[{a, b}, PlotStyle -> {Red, Blue}] 

結果是:
enter image description here

CPU利用率:
enter image description here

我覺得我缺少關於並行化[]一些重要的知識來理解這一點。

任何提示?

+0

作爲您的原始信息頁說您是前物理學家,我必須問:軸標籤?單位?在'f'中嵌入'AbsoluteTiming'最初是令人困惑的。 – rcollyer 2011-03-20 18:34:11

+0

@rcollyer時間單位對於問題沒有意義,因爲它們是機器相關的。至於標籤,你可以從前面的代碼中讀取AbsoluteTime [] Vs是一個與迭代次數線性相關的非維數。順便說一句,我從來沒有說我是一個好物理學家:D – 2011-03-20 18:46:30

+0

第二張圖有兩個幾乎相同的曲線om我的quadcore筆記本電腦。 – 2011-03-20 18:48:56

回答

6

我的猜測是,問題不在Parallelize,而是在你正在嘗試計算。對於Mod,結果總是爲1或0,也是產品。對於Sin,由於您使用整數算術,因此會積累巨大的符號表達式(Sin[i]的產品)。它們在計算後被丟棄,但它們需要堆空間(內存分配/釋放)。您觀察到的二次行爲可能是由於大尺寸內存分配的線性複雜性,「乘以」迭代的內存複雜度。這似乎是主要的影響,它影響了Parallelize的實際成本。如果你申請N,如[email protected][i],結果是完全不同的。

+2

你擊敗了我。難道你沒有比在這裏閒逛更好的事情嗎? ;-) – 2011-03-20 18:57:26

+0

謝謝。非常明確的解釋。 – 2011-03-20 19:24:55

+1

@Sjoerd你不會相信:)這一次,我整天都在外面,只是進來,不小心看到了這個問題 - 即將關閉電腦:) – 2011-03-20 19:32:51

3

試試這個版本,我相信你會知道發生了什麼。

CloseKernels[]; 
LaunchKernels[1] 
f[n_, g_] := 
    [email protected][ 
    g[Product[[email protected], {i, 1, n/2}] Product[[email protected], {i, n/2 + 1, n}]]]; 
Clear[a, b]; 
a = Table[f[i, Identity], {i, 1000, 15000, 1000}]; 
LaunchKernels[1] 
b1 = Table[f[i, Parallelize], {i, 1000, 15000, 1000}]; 
b2 = Table[f[i, Parallelize], {i, 1000., 15000., 1000.}]; 
ListLinePlot[{a, b1, b2}, PlotStyle -> {Red, Blue, Green}] 
+0

@Sojerd很好,並澄清例子。對不起,我不能接受這兩個答案:( – 2011-03-20 22:00:12

5

要了解什麼是使用Parallelize時會在幕後,這是一個好主意,使並行計算工具包的調試模式,即:

Needs["Parallel`Debug`"] 
SetOptions[$Parallel, Tracers -> {SendReceive}] 

第二個例子會產生大量MathLink的的通信開銷,因爲應用於整數的Sin函數不會立即通過Mathematica評估(如Leonid Shifrin已經提到的那樣):

下面是一部分調試輸出:

SendReceive: Receiving from kernel 13: Subscript[iid, 105][Sin[1] Sin[2] Sin[3] Sin[4] Sin[5] Sin[6] Sin[7] Sin[8] Sin[9] Sin[10] Sin[11] Sin[12] Sin[13] Sin[14] Sin[15] Sin[16] Sin[17] Sin[18] Sin[19] Sin[20] Sin[21] Sin[22] Sin[23] Sin[24] Sin[25] Sin[26] Sin[27] Sin[28] Sin[29] Sin[30] Sin[31] Sin[32] Sin[33] Sin[34] Sin[35] Sin[36] Sin[37] Sin[38] Sin[39] Sin[40] Sin[41] Sin[42] Sin[43] Sin[44] Sin[45] Sin[46] Sin[47] Sin[48] Sin[49] Sin[50] Sin[51] Sin[52] Sin[53] Sin[54] Sin[55] Sin[56] Sin[57] Sin[58] Sin[59] Sin[60] Sin[61] Sin[62] Sin[63] Sin[64] Sin[65] Sin[66] Sin[67] Sin[68] Sin[69] Sin[70] Sin[71] Sin[72] Sin[73] Sin[74] Sin[75] Sin[76] Sin[77] Sin[78] Sin[79] Sin[80] Sin[81] Sin[82] Sin[83] Sin[84] Sin[85] Sin[86] Sin[87] Sin[88] Sin[89] Sin[90] Sin[91] Sin[92] Sin[93] Sin[94] Sin[95] Sin[96] Sin[97] Sin[98] Sin[99] Sin[100] Sin[101] Sin[102] Sin[103] Sin[104] Sin[105] Sin[106] Sin[107] Sin[108] Sin[109] Sin[110] Sin[111] Sin[112] Sin[113] Sin[114] Sin[115] Sin[116] Sin[117] Sin[118] Sin[119] Sin[120] Sin[121] Sin[122] Sin[123] Sin[124] Sin[125] Sin[126] Sin[127] Sin[128] Sin[129] Sin[130] Sin[131] Sin[132] Sin[133] Sin[134] Sin[135] Sin[136] Sin[137] Sin[138] Sin[139] Sin[140] Sin[141] Sin[142] Sin[143] Sin[144] Sin[145] Sin[146] Sin[147] Sin[148] Sin[149] Sin[150] Sin[151] Sin[152] Sin[153] Sin[154] Sin[155] Sin[156] Sin[157] Sin[158] Sin[159] Sin[160] Sin[161] Sin[162] Sin[163] Sin[164] Sin[165] Sin[166] Sin[167] Sin[168] Sin[169] Sin[170] Sin[171] Sin[172] Sin[173] Sin[174] Sin[175] Sin[176] Sin[177] Sin[178] Sin[179] Sin[180] Sin[181] Sin[182] Sin[183] Sin[184] Sin[185] Sin[186] Sin[187] Sin[188] Sin[189] Sin[190] Sin[191] Sin[192] Sin[193] Sin[194] Sin[195] Sin[196] Sin[197] Sin[198] Sin[199] Sin[200] Sin[201] Sin[202] Sin[203] Sin[204] Sin[205] Sin[206] Sin[207] Sin[208] Sin[209] Sin[210] Sin[211] Sin[212] Sin[213] Sin[214] Sin[215] Sin[216] Sin[217] Sin[218] Sin[219] Sin[220] Sin[221] Sin[222] Sin[223] Sin[224] Sin[225] Sin[226] Sin[227] Sin[228] Sin[229] Sin[230] Sin[231] Sin[232] Sin[233] Sin[234] Sin[235] Sin[236] Sin[237] Sin[238] Sin[239] Sin[240] Sin[241] Sin[242] Sin[243] Sin[244] Sin[245] Sin[246] Sin[247] Sin[248] Sin[249] Sin[250] Sin[251] Sin[252] Sin[253] Sin[254] Sin[255] Sin[256] Sin[257] Sin[258] Sin[259] Sin[260] Sin[261] Sin[262] Sin[263] Sin[264] Sin[265] Sin[266] Sin[267] Sin[268] Sin[269] Sin[270] Sin[271] Sin[272] Sin[273] Sin[274] Sin[275] Sin[276] Sin[277] Sin[278] Sin[279] Sin[280] Sin[281] Sin[282] Sin[283] Sin[284] Sin[285] Sin[286] Sin[287] Sin[288] Sin[289] Sin[290] Sin[291] Sin[292] Sin[293] Sin[294] Sin[295] Sin[296] Sin[297] Sin[298] Sin[299] Sin[300] Sin[301] Sin[302] Sin[303] Sin[304] Sin[305] Sin[306] Sin[307] Sin[308] Sin[309] Sin[310] Sin[311] Sin[312] Sin[313] Sin[314] Sin[315] Sin[316] Sin[317] Sin[318] Sin[319] Sin[320] Sin[321] Sin[322] Sin[323] Sin[324] Sin[325] Sin[326] Sin[327] Sin[328] Sin[329] Sin[330] Sin[331] Sin[332] Sin[333] Sin[334] Sin[335] Sin[336] Sin[337] Sin[338] Sin[339] Sin[340] Sin[341] Sin[342] Sin[343] Sin[344] Sin[345] Sin[346] Sin[347] Sin[348] Sin[349] Sin[350] Sin[351] Sin[352] Sin[353] Sin[354] Sin[355] Sin[356] Sin[357] Sin[358] Sin[359] Sin[360] Sin[361] Sin[362] Sin[363] Sin[364] Sin[365] Sin[366] Sin[367] Sin[368] Sin[369] Sin[370] Sin[371] Sin[372] Sin[373] Sin[374] Sin[375] Sin[376] Sin[377] Sin[378] Sin[379] Sin[380] Sin[381] Sin[382] Sin[383] Sin[384] Sin[385] Sin[386] Sin[387] Sin[388] Sin[389] Sin[390] Sin[391] Sin[392] Sin[393] Sin[394] Sin[395] Sin[396] Sin[397] Sin[398] Sin[399] Sin[400] Sin[401] Sin[402] Sin[403] Sin[404] Sin[405] Sin[406] Sin[407] Sin[408] Sin[409] Sin[410] Sin[411] Sin[412] Sin[413] Sin[414] Sin[415] Sin[416] Sin[417] Sin[418] Sin[419] Sin[420] Sin[421] Sin[422] Sin[423] Sin[424] Sin[425] Sin[426] Sin[427] Sin[428] Sin[429] Sin[430] Sin[431] Sin[432] Sin[433] Sin[434] Sin[435] Sin[436] Sin[437] Sin[438] Sin[439] Sin[440] Sin[441] Sin[442] Sin[443] Sin[444] Sin[445] Sin[446] Sin[447] Sin[448] Sin[449] Sin[450] Sin[451] Sin[452] Sin[453] Sin[454] Sin[455] Sin[456] Sin[457] Sin[458] Sin[459] Sin[460] Sin[461] Sin[462] Sin[463] Sin[464] Sin[465] Sin[466] Sin[467] Sin[468] Sin[469] Sin[470] Sin[471] Sin[472] Sin[473] Sin[474] Sin[475] Sin[476] Sin[477] Sin[478] Sin[479] Sin[480] Sin[481] Sin[482] Sin[483] Sin[484] Sin[485] Sin[486] Sin[487] Sin[488] Sin[489] Sin[490] Sin[491] Sin[492] Sin[493] Sin[494] Sin[495] Sin[496] Sin[497] Sin[498] Sin[499] Sin[500]] (q=0)