2010-12-08 108 views
3

我們使用OpenMP(libgomp)來加速多線程Qt應用程序中的一些計算。並行OpenMP部分位於兩個不同的線程中,但實際上它們並不會並行執行。我們在這種情況下觀察到的是2N(其中N = OMP_THREAD_LIMIT)omp線程啓動,顯然互相干擾。計算時間非常長,而處理器負載很低。設置OMP_WAIT_POLICY幾乎沒有任何影響。在已經多線程的應用程序中使用OpenMP(libgomp)

我們也嘗試將所有omp節移到單個線程中(但從架構的角度來看,這不是一個好的解決方案)。在這種情況下,整體計算時間確實會下降並且處理器已滿載,但前提是OMP_WAIT_POLICY設置爲ACTIVE。當OMP_WAIT_POLICY == PASSIVE時,計算時間保持較低,處理器空閒50%的時間。

奇怪的是,當我們在單線程中使用omp時,與多線程情況相比,使用omp(在一系列omp計算中)並行化的第一個循環執行速度要慢10倍。

UPD:我們的問題是:

一)有沒有辦法在不同的線程的上下文中使用OMP時,重用OpenMP的線程。

b)爲什麼使用OMP_WAIT_POLICY == PASSIVE執行會減慢一切。喚醒線程需要很長時間嗎?

c)是那裏的第1並聯塊的速度比較慢(即使在主動模式下等待時)

UPD2的現象,任何合乎邏輯的解釋:請注意該問題可能與GNU OMP實施。 icc沒有它。

+0

而你的問題是? – 2010-12-08 15:00:26

+0

對不起,我更新了 – 2010-12-08 15:09:24

回答

1

嘗試使用omp_set_num_threads(1)omp_set_num_threads(cpucount)

此調用與(1)應停止所有的OpenMP工作線程開始運行時/停止OpenMP的線程,並與(cpu_num)調用將再次重新啓動它們。

因此,在程序開始時,運行omp_set_num_threads(1)。 在omp並行化區域之前,即使使用WAIT_POLICY=active也可以啓動omp線程,並且在此之前它們不會消耗CPU。

在omp並行區域之後,您可以再次停止線程。

omp_set_num_threads(cpucount)調用非常慢,比用wait_policy = passive喚醒線程要慢。這可能是(c)的原因 - 如果你的libgomp只在第一個並行區域啓動線程。