2015-03-18 16 views
8

Sorumum, dinamik kitaplıklarda depolanan C++ işlevlerinde OpenMP kullanımıyla ilgilidir. en (shared.cpp olarak) şu kodu düşünelim:Dinamik kitaplıklardan yüklenen işlevde OpenMP kullanarak zor bir hata

#include "omp.h" 
#include <iostream> 
extern "C" { 
int test() { 
    int N = omp_get_max_threads(); 
#pragma omp parallel num_threads(N) 
    { 
    std::cout << omp_get_thread_num() << std::endl; 
    } 
    return 0; 
} 
}; 

ben g ++ kullanımı bu kodu derlemek: gr ++ -fopenmp -shared -fpic -o shared.so shared.cpp.

#include <iostream> 
#include <dlfcn.h> 
int main() { 
    void* handle = dlopen("./shared.so", RTLD_NOW); 
    if (!handle) { 
    std::cerr << "can not open shared.so" << std::endl; 
    return 1; 
    } 
    int(*f)() = (int(*)()) dlsym(handle,"test"); 
    if (!f) { 
    std::cerr << "can not find 'test' symbol in shared.so" << std::endl; 
    return 1; 
    } 
    (*f)(); 
    if (dlclose(handle)) { 
    std::cerr << "can not close shared.so" << std::endl; 
    return 1; 
    } 
    return 0; 
} 

komutuyla derlenmiş: g ++ -o ana main.cpp -ldl sorun olduğunu sonra, Test fonksiyonu kullanmak için, aşağıdaki programı (main.cpp) sahip Program yürütme işleminin sonunda bölümleme hatası oluşur. Valgrind göre, bazı konuları hala bu noktada aktif, OpenMP davranışı ile uyumlu gibi görünüyor.

this post, (C kodu için)

bir çözüm gcc -fopenmp bayrak kullanarak programı derlemek için ama OpenMP bu programda kullanılan hiçbir zaman olduğunu tespit etmek için akıllı görünmektedir g ++ ve OpenMP çevre yüklü asla (her iki sürümün montaj kodu eşittir). Bulduğum tek geçici çözüm, OpenMP ortamını yüklemek için g ++ 'yı zorlayan programda OpenMP'ye gereksiz bir çağrı yapmaktır ve yürütme daha sonra doğrudur. Ama benim için bu geçici çözüm oldukça çirkin. G ++ - 4.8.2, g ++ - 4.8.1, g ++ - 4.7.3 ve g ++ - 4.6.4'ü denedim. (Programda -openmp seçeneğini kullanarak icc-14, sorunu gerçekten düzeltin).

Bu problemle karşı karşıya olan var mı? Daha temiz bir çözüm var mı? sayesinde Thomas

++ G ile çalıştı Düzenleme - 4.9.2: hala sana libgomp ile ilgili bir sorun görüyorsanız düşünüyorum

cevap

1

başarısız GCC OpenMP çalışma zamanı kitaplığı. Onunla bağlantı kurmayı deneyin: g ++ -o ana main.cpp -ldl -lgomp ve segfault'ınız gitmiş olacak. libgomp, ilk OpenMP çağrısında başlatılan bazı dahili duruma sahiptir. Herhangi bir nedenle, bir OpenMP kitaplığı dinamik olarak yüklerseniz, başlatılamadı. Bana bir böcek gibi geliyor.

istihbarat derleyici bu sorunu yok OpenMP çalışma zamanı (libiomp5) kendi vardır.