2011-12-19 2 views
0

누구든지 포트란에 세마포어 기능을 쓸 수 있습니까? 여러 프로세스가 실행 중이고 세마포어를 사용하여 동기화해야합니다. 이러한 코드는 C++ 등에서 찾을 수 있지만 fortran에 대해서는 그런 코드를 찾을 수 없습니다.포트란에 대한 세마포어

Fortran 코드에서 C/C++ 함수를 호출 할 수 있다면 C++ 세마포어 함수가 이미 있으므로이 코드로도 충분합니다.

추신 : (추가 설명) 다음은 C++에서 작동하는 코드입니다. 표준 벤치 마크의 일부로 fortran 어플리케이션을 가지고 있지만 그것들을 동기화하는 세마포어 코드는 없습니다.

int get_semaphore() 
    { 
    int sem_id; 
    sem_id = semget(SEM_ID, 1, IPC_CREAT | 0666); 
if (sem_id == -1) { 
    perror("get_semaphore: semget"); 
    exit(1); 
} 
return sem_id; 
} 


int set_semaphore (int sem_id, int val) 
    { 
    return semctl(sem_id, 0, SETVAL, val); 
    } 

void decrement_semaphore (int sem_id) 
{ 
struct sembuf sem_op; 
sem_op.sem_num = 0; 
sem_op.sem_op = -1; 
sem_op.sem_flg = 0; 
semop(sem_id, &sem_op, 1); 
} 

void wait_semaphore (int sem_id) 
{ 
struct sembuf sem_op; 
sem_op.sem_num = 0; 
sem_op.sem_op = 0; 
sem_op.sem_flg = 0; 
    semop(sem_id, &sem_op, 1); 
    } 

미리 도움을 주셔서 감사합니다.

+0

더 구체적으로 수행하고자하는 것이 무엇입니까? 벌써 해봤 니? 코드 샘플을 게시 할 수 있습니까? Fortran에서 MPI를 조사하고 싶을 수도 있습니다. http://www.mcs.anl.gov/research/projects/mpi/ – milancurcic

+0

@ IRO-bot C++ 코드 조각을 제공했습니다. MPI는 병렬 코드가 아니기 때문에 사용할 수 없습니다. 동기화를 위해서는 세마포가 필요합니다. 그 외에는 공유가 없습니다. – user984260

+0

OK, 잘하면 누군가가칩니다, 이건 내 도메인이 아니야 :) – milancurcic

답변

2

OpenMP는 "잠금"이라는 용어로 세마포어를 제공합니다. 일반적으로 OpenMP는 더 높은 수준의 작업 구성을 제공하기 때문에 사용되지 않지만, 직접 수행하려는 경우 Fortran에서 명시 적으로 잠금/잠금 해제를 수행하는 방법이 될 수 있습니다.

P. 이미 가지고있는 C 코드를 Fortran 2003의 ISO C Binding을 사용하여 호출하면 Fortran에서 할 수 있습니다.이 방법에 대한 많은 질문/답변이 있습니다. 나는 Fortran 프로그램이 C 루틴과 일치하도록 선언문을 작성했다. 이것들은 Fortran 컴파일러에게 C 컴파일러의 호출 규칙을 사용하여 C 루틴을 호출하는 방법을 알려줍니다. 테스트되지 않았으므로 디버깅이 필요할 수 있습니다.

use iso_c_binding 

interface semaphore_stuff 

    function get_semaphore() bind (C, name="get_sempaphore") 
     import 
     integer (c_int) :: get_semaphore 
    end function get_semaphore() 

    function set_semaphore (sem_id, int val) bind (C, name="get_sempaphore") 
     import 
     integer (c_int) :: set_semaphore 
     integer (c_int), intent (in), value :: sem_id 
     integer (c_int), intent (in) value :: val 
    end function set_semaphore 

    subroutine decrement_semaphore (sem_id) bind (C, name="decrement_semaphore") 
     import 
     integer (c_int), intent (in), value :: sem_id 
    end subroutine decrement_semaphore 

    subroutine wait_semaphore (sem_id) bind (C, name="wait_semaphore") 
     import 
     integer (c_int), intent (in), value :: sem_id 
    end subroutine wait_semaphore 

end interface semaphore_stuff 
+0

사용자가 MPMD 설정을 사용하는 방법은 분명하지 않습니다. 세마포어에 동의하는 다른 프로그램을 어떻게 얻습니까? 내 생각 엔 몇 가지 샤드 메모리 세그먼트가 있고 거기에 자물쇠가 있나? 하지만 그건 문제를 포트란과 함께 mmap을 사용하는 방법으로 바꾼 것입니다 ... –