【问题标题】:Semaphores for fortranfortran的信号量
【发布时间】:2011-12-19 17:03:41
【问题描述】:

谁能帮忙用fortran写一个信号量函数?我有多个进程正在运行,我必须使用信号量来同步它们。对于 C++ 等,可以找到这样的代码,但我在 fortran 中找不到任何这样的代码。

如果我可以从 fortran 代码中调用 C/C++ 函数,那就足够了,因为 C++ 信号量函数已经存在。

PS:(附加说明)这是适用于 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);
  } 

提前感谢您的帮助。

【问题讨论】:

  • 我建议在您的问题中更具体地说明您想要完成什么。你已经尝试过什么了吗?您可以发布代码示例吗?您可能想查看 Fortran 的 MPI:mcs.anl.gov/research/projects/mpi
  • @IRO-bot 我已经给出了一个 c++ 代码片段。我不能使用 MPI,因为它不是并行代码:只是为了同步,需要信号量。除此之外,没有共享。
  • 好的,希望有人能参与进来,这不是我真正的领域 :)
  • 我还是不明白。您如何在需要信号量的 fortran 中进行多线程处理?没有本地 Fortran 方法可以访问此类低级系统内容。
  • @JonathanDursi 我正在使用 Marss 进行多核仿真,每个核心运行一个基准程序,它是 fortran 或 C 程序。为了在基准的感兴趣区域创建一个检查点,我想使用信号量。对于 C 语言的基准测试,我已经有了代码。只是fortran,我需要一个。如果我可以从 fortran 调用 C 函数,Fortran-C 混合编程可以工作。

标签: fortran semaphore shared-memory


【解决方案1】:

OpenMP 在术语“锁定”下提供信号量。通常不使用这些,因为 OpenMP 提供了更高级别的任务构造,但如果您想自己做,这可能是一种使用 Fortran 进行显式锁定/解锁的方法。

附:如果您想通过调用已有的 C 代码从 Fortran 执行此操作,则可以通过使用 Fortran 2003 的 ISO C 绑定来完成。这里有很多关于其工作原理的问题/答案。我为您的 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

【讨论】:

  • 我不清楚用户如何在他们的 MPMD 设置中使用它;你如何让不同的程序就信号量达成一致?我想 mmap 一些分片内存段并在那里锁定?但这只是将问题转移到您如何将 mmap 与 fortran 一起使用......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-24
  • 2020-02-16
  • 1970-01-01
  • 1970-01-01
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多