FortranからCUDAを呼ぶその1:C言語をFortranから呼び出してみる

CUDAを呼び出す前に、C言語を呼び出してみます。題材とさせて貰うのは、GPGPU 勉強会 - CUDA Samples配列の足し算/C言語による例です。
vecadd.c→「vecadd_C.c, vecadd_main.f90」へと書き換えました。以下code例です。

vecadd_C.c

#include <stdio.h>

// 配列の足し算を行う関数
void vecadd(float *x, float *y, float *z, int N)
{
  int i;
  for(i = 0; i < N; i++)
    z[i] = x[i] + y[i];
}

// Fortranから呼ばれる部分
void vecadd_(float *x, float *y, float *z, int *N)
{
  vecadd(x, y, z, *N);
}

vecadd_main.f90

program vecadd_main

  implicit none
  
  integer, parameter:: N=10  !  配列のサイズを指定する
  integer:: i
  real(4):: x(N), y(N), z(N)
  
! 初期値の設定
 
  do i=1,N
     x(i)=i-1 + 1.0
     y(i)=i-1 + 2.0
  enddo

! ここで足し算を行う(C言語の関数呼び出し)

  call vecadd(x, y, z, N);

! 出力

  do i=1,N
     write(*,*)i, z(i)
  enddo
  
end program vecadd_main

実行

% icc -c vecadd_C.c
% ifort -o vecadd.exe vecadd_main.f90 vecadd_C.o
% ./vecadd.exe

実行結果

           1   3.000000    
           2   5.000000    
           3   7.000000    
           4   9.000000    
           5   11.00000    
           6   13.00000    
           7   15.00000    
           8   17.00000    
           9   19.00000    
          10   21.00000  

FortranからCを呼び出すときに注意すること

  • Fortranから渡された変数は、C言語内ではポインタ扱いになる
  • 配列の並びと開始
  • Fortranから呼ばれる関数をC言語にて記述するとき、_をつける
  • etc.(書きかけ)