2013-05-13 2 views
-1

을 행의 합계 2.718로 계산하기로 결정했습니다. OpenMP가없는 코드가 완벽하게 작동하며 계산을 위해 걸리는 시간을 측정했습니다. 그러나 OpenMP를 사용하여 계산을 평준화 할 때 오류가 발생했습니다. 코어 i7 (8 코어 4 로직 4 물리)에서 프로그램을 실행하고 있습니다. 사람들이 말하는 것처럼 openMP를 사용하지 않고 두 배나 빠른 시간을 가져야합니다.OpenMP C++ (compliring with trouble)

#include <iostream> 
    #include <time.h> 
    #include <math.h> 
    #include "fact.h" 
    #include <cstdlib>; 
    #include <conio.h>; 
    using namespace std; 
    int main() 
    { 
clock_t t1,t2; 
int n; 
long double exp=0; 
long double y; 
int p; 
cout<<"Enter n:"; 
cin>>n; 
t1=clock(); 
    #pragma omp parallel for num_threads(2); 
for(int i=1; i<n; i++) 
{ 
p=i+1; 
    exp=exp+(1/((fact(p)))); 
} 
t2=clock(); 
double total_clock; 
total_clock=t2-t1; 
long double total_exp; 
total_exp=exp+2; 
cout<<total_clock<<"\n the time is used for parralel calculations"<<endl; 
cout<<total_exp<<endl; 

cin.get(); 
getch(); 
    return 0; 
    } 

사실() 수

long double fact(int N) 

    { 
    if(N < 0) 
     return 0; 
    if (N == 0) 
    return 1; 
    else 
    return N * fact(N - 1); 
    } 

오류 3 오류 C3005의 계승을 계산하는 함수를 사용하여 : : 다음은 내 코드입니다 : C "병렬"지시문의 OpenMP의 예기치 않은 토큰 : \ 사용자 \ александр 문서는 비주얼 스튜디오 2012 \ 프로젝트 \ \ \의 ConsoleApplication1 \의 ConsoleApplication1 \ openmp.cpp 18

+0

AFAIK VS는 OpenMP를 사용하기 위해 특별한 설정이 필요합니다. – maverik

+0

세미콜론이 없어야한다고 생각합니다. –

+0

사실이 경우 컴파일러 오류 메시지는 매우 명확하고 오류에 국한됩니다. –

답변

1
의 OpenMP 프라그 마를 사용하는 경우, 세미콜론이 필요하지 않은

, 그는 nce :

"#pragma omp parallel for num_threads (2);"

이어야 "NUM_THREADS 용의 #pragma OMP 평행 (2)"

않고;

+0

num_threads (2), 가장 빠른 컴퓨팅에 도달하는 데 사용할 수있는 스레드의 양 ??? –

+1

네 개의 실제 코어가 있으므로 num_threads (4)가 좋은 시작이어야합니다. i7 프로세서가 하이퍼 스레딩을 지원하므로 최대 8 개의 스레드 번호를 시도 할 수 있습니다. 그냥 테스트하고 시간을 비교하십시오. 또한 당신의 코드에주의해야합니다 : #pragma omp parallel for num_threads (2) reduce (+ : exp) 모든 스레드는 아무 것도 고려하지 않고 전역 변수 (exp)에 액세스합니다. 해야 할 일은 각 스레드에 대한 로컬 변수를 유지하고 끝에 모든 변수를 추가하는 것입니다. 감소는이 문제를 해결하는 좋은 방법입니다. https://computing.llnl.gov/tutorials/openMP/#REDUCTION – Emilcasvi

+0

어떻게 각 스레드의 반복 횟수를 얻을 수 있습니까 ?? –