gpt4 book ai didi

c++ - 嵌套的 openmp 导致段错误(仅限 MacOS X)

转载 作者:行者123 更新时间:2023-11-30 04:31:03 25 4
gpt4 key购买 nike

我正在构建一个使用嵌套 omp 的 C++ 应用程序。然而,它会导致崩溃。当删除两个 omp 之一,或者等待函数在主文件本身内时,问题就解决了。操作系统是 MacOS X Lion,编译器应该是 llvm-gcc 或 gcc-4.2(我不确定,只是使用了 cmake...)然后我构建了以下应用程序来演示:

编辑:我现在在 Linux 机器上尝试了同样的方法,它工作正常。所以这是一个纯粹的 MACOS X(狮子)问题。

OMP_NESTED 设置为真。

主要内容:

#include "waiter.h"
#include "iostream"
#include "time.h"
#include <omp.h>


void wait(){
int seconds = 1;

#pragma omp parallel for
for (int i=0;i<2;i++){
clock_t endwait;
endwait = clock () + seconds * CLOCKS_PER_SEC ;
while (clock() < endwait) {}
std::cout << i << "\n";
}
}

int main(){
std::cout << "blub\n";

#pragma omp parallel for
for(int i=0;i<5;i++){
Waiter w; // causes crash
// wait(); // works
}
std::cout << "blub\n";

return 0;
}

标题:

#ifndef WAITER_H_
#define WAITER_H_

class Waiter {
public:
Waiter ();
};

#endif // WAITER_H_

实现:

#include "waiter.h"
#include "omp.h"
#include "time.h"
#include <iostream>

Waiter::Waiter(){
int seconds = 1;

#pragma omp parallel for
for (int i=0;i<5;i++){
clock_t endwait;
endwait = clock () + seconds * CLOCKS_PER_SEC ;
while (clock() < endwait) {}
std::cout << i << "\n";
}
}

CMakeLists.txt:

cmake_minimum_required (VERSION 2.6)
project (waiter)

set(CMAKE_CXX_FLAGS "-fPIC -fopenmp")
set(CMAKE_C_FLAGS "-fPIC -fopenmp")
set(CMAKE_SHARED_LINKDER_FLAGS "-fPIC -fopenmp")

set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)

add_library(waiter SHARED waiter.cpp waiter.h)
add_executable(use_waiter use_waiter.cpp)
target_link_libraries(use_waiter waiter)

感谢您的帮助!

最佳答案

编辑:重写了更多细节。

openmp 在 gcc 4.2 上导致间歇性故障,但它已被 gcc 4.6.1(或可能是 4.6)修复。您可以从 http://hpc.sourceforge.net/ 获得 4.6.1 二进制文件(寻找 gcc-lion.tar.gz)。

低于gcc 4.6.1的lion中openmp的失败是断断续续的。它似乎发生在多次 openmp 调用之后,因此嵌套的可能性更大,但嵌套不是必需的。这link没有嵌套的 openmp(在标准单线程 for 中有一个并行 for)但失败了。我自己的代码在 lion 中使用 gcc 4.2(没有嵌套编译指示)正常工作了几分钟后,由于 openmp 而间歇性挂起或崩溃,并被 gcc 4.6.1 完全修复。

我下载了你的代码并用 gcc 4.2 编译它,它在我的机器上运行良好(同时使用 Waiter w;wait(); 选项:-) .我刚刚使用:

g++ -v -fPIC -fopenmp use_waiter.cpp waiter.cpp -o waiter

我尝试增加循环最大值,但仍然无法让它失败。我看到了开头和结尾的 blub

您看到了什么错误消息?

您确定正在使用您下载的 gcc 4.6(使用 -v 确定)吗?

另见 here .

关于c++ - 嵌套的 openmp 导致段错误(仅限 MacOS X),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8376288/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com