How to create Fortran interface for type void ** p

2019-10-07 22:34发布

I am new to use Fortran, and for a c function like below:

cudaError_t cudaMalloc  (void** devPtr, size_t size)

Allocates size bytes of linear memory on the device and returns in *devPtr a pointer to the allocated memory. The allocated memory is suitably aligned for any kind of variable. The memory is not cleared. cudaMalloc() returns cudaErrorMemoryAllocation in case of failure.

Parameters:
devPtr  - Pointer to allocated device memory
size    - Requested allocation size in bytes

Returns:
cudaSuccess, cudaErrorMemoryAllocation

I want to create an Fortran interface to use this c function but how to fix void** ptr? Can anyone help me? Thanks in advance!

1条回答
Viruses.
2楼-- · 2019-10-07 23:23

I have no idea whether it will work OK with the device pointers (i.e., if cudaMalloc is callable from non-CUDA C), but generally in Fortran-C interoperability you represent void* as type(c_ptr) from the iso_c_binding module. C interoperable procedures pass their arguments by reference by default, so this should work:

integer(c_int) function cudaMalloc(devPtr, size) bind(C,name="cudaMalloc")
  use iso_c_binding
  type(c_ptr) :: devPtr
  integer(c_size_t), value :: size
end function

The pointer is passed by reference, so that the C side sees a pointer to pointer and can change it to store the value of the device pointer.

With some more work you can also define the enumeration with the return codes.

查看更多
登录 后发表回答