2015-09-21 22 views
6

Tôi có đoạn mã sau:Clang + OpenMP trên Linux chỉ sử dụng 1 CPU lõi

int main(int argc, char** argv) 
{ 
    const int64_t N = 10000000000; 
    float* data = new float[N]; 
    int64_t i; 

    omp_set_dynamic(0); 
    omp_set_num_threads(4); 

    #pragma omp parallel for 
    for(i = 0; i < N; ++i) 
     data[i] = i*i; 

    return 0; 
} 

Nếu tôi biên dịch nó với g ++ sau đó trong thời gian chạy mã sử dụng 4 lõi:

g++ -fopenmp -std=c++11 main.cpp 

Nếu tôi biên dịch nó với kêu vang ++ 3.7 sau đó trong thời gian chạy mã chỉ sử dụng 1 lõi:

clang++-3.7 -fopenmp -std=c++11 main.cpp 

Trong cả hai trường hợp tôi đã thiết lập:

OMP_NUM_THREADS=4 

Cả hai trình biên dịch đã được cài đặt từ kho Debian Testing:

sudo apt-get install g++-5 
sudo apt-get install clang-3.7 

Vì vậy, bất kỳ ý tưởng tại sao kêu vang chỉ sử dụng một lõi? Cảm ơn trước.

Trả lời

5

Xem this:

OpenMP 3.1 is fully supported, but disabled by default. To enable it, please use the -fopenmp=libomp command line option.

Dường như bạn bỏ lỡ -fopenmp=libomp trong cờ biên dịch của bạn.

+0

Xin chào. Bằng cách sử dụng tùy chọn này tôi nhận được một lỗi: '/ usr/bin/ld: không thể tìm thấy -lomp'. Tôi cũng đã cố gắng sử dụng '-fopenmp = libgomp'. Với cờ này, mã biên dịch nhưng nó vẫn sử dụng 1 lõi CPU. – AstrOne

+1

một cách trung thực, IDK có vấn đề gì, nhưng tôi sẽ cố gắng cài đặt tiếng lóng từ các nguồn, hoặc cài đặt gói 'libiomp-dev' và sử dụng '-fopenmp = libomp' hoặc' -fopenmp = libiomp5' ... – Gilles

+1

Tắt libomp bằng cách nào đó đi kèm với thư viện omp intel. Hơn nữa, gói hiện đang trải qua một số chuyển đổi lớn trong kho Debian. Và để làm cho mọi thứ tồi tệ hơn, nó hiện đang bị loại bỏ khỏi kho kiểm tra. (nhưng nó tồn tại trên sid). Tôi đoán sẽ phải đợi hoặc chỉ sử dụng phiên bản sid. :) Cảm ơn sự giúp đỡ của bạn tôi! – AstrOne

Các vấn đề liên quan