簡體   English   中英

OpenMP並行化停止工作

[英]OpenMP parallelization stopped working

在Linux上,使用g ++ 4 7.1的AMD 8核處理器。

對我來說,這是一個危險。 以下代碼運行良好,並且由於某種原因停止了並行化。 我添加了omp_get_num_procs(),它可以打印8個處理器。 我檢查了編譯,並且-fopenmp作為鏈接和編譯的選項存在。 沒有編譯/鏈接錯誤消息。 我檢查是否定義了任何環境變量(OMP_xxx)-沒有。

還有其他可能影響外部的因素嗎?

#pragma omp parallel
{
  lightray ray;
  rgba L;
  printf("Max nr processors: %d\n", omp_get_num_procs());

  #pragma omp for schedule(dynamic)
  for (int xy = 0; xy < xy_range; xy++) {
    int x = x_from + (xy % x_width);
    int y = y_from + (xy / x_width);
    ray = cam->get_ray_at(x, y);
    L = trace_ray(ray, 0, cam->inter);
    cam->set_pixel(x, y, L);
  }
}
dtime = omp_get_wtime() - dtime;
printf("time %f\n", dtime);
}

編輯:我想我已經在這里找到了一些... Anjuta生成的g ++命令行包含以下內容:

-DPACKAGE_LOCALE_DIR=\""/usr/local/share/locale"\" -DPACKAGE_SRC_DIR=\"".. -fopenmp  . "\" 

PACKAGE_SRC_DIR定義似乎“包含”了-fopenmp標志,這會將其從g ++隱藏。 尚未找到原因...

嘗試以這種方式重寫它:

lightray ray;
rgba L;
printf("Max nr processors: %d\n", omp_get_num_procs());

#pragma omp parallel for schedule(dynamic) private(ray,L)
for (int xy = 0; xy < xy_range; xy++) {
  int x = x_from + (xy % x_width);
  int y = y_from + (xy / x_width);
  ray = cam->get_ray_at(x, y);
  L = trace_ray(ray, 0, cam->inter);
  cam->set_pixel(x, y, L);
}
dtime = omp_get_wtime() - dtime;
printf("time %f\n", dtime);

這樣,您將rayL引入為特定於每個線程的變量,從而對循環進行標記。 由於默認情況下,在並行區域之外定義的變量在線程之間共享,因此您當前的實現方式是對這兩個變量進行調整。

另外, omp_get_num_procs() “返回該程序可用的處理器數量。” 根據OpenMP API 3.1 C / C ++語法快速參考卡-因此,它不一定告訴您一個區域中實際使用了多少個線程。 為此,您可能需要omp_get_num_threads()omp_get_thread_num()

這似乎是程序外部的問題。 我確實更改了IDE版本(Anjuta)。 Anjuta非常依賴pkg-config。 OpemMP沒有pkg-config .pc文件,因此我為libgomp庫制作了一個。 我將-lgomp添加到了Libs:效果很好,並且將-fopenmp添加到了兩個Libs:和Cflags:效果不佳。

由於某些原因,-fopenmp被添加到稱為-DPACKAGE_SRC_DIR的命令行參數中(在其引號內-參見原始消息中的編輯),因此鏈接器和編譯器將其忽略。 我會在Anjuta論壇上問這個問題。

因此,解決方案是將其從.pc文件中刪除,然后將其手動添加為項目參數“ CXXFLAGS = -fopenmp”和“ LDFLAGS = -fopenmp”(我想避免這種情況,因為下次我肯定會忘記做:)

無論如何,它是這樣工作的。 感謝您的建議。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM