Tag: intel fortran

返回指向设备分配矩阵的指针从C到Fortran

首先,我是Fortran / C / CUDA的新手。 其次,我正在研究一个使用cuBLAS在GPU上执行矩阵向量乘法的Fortran / C程序。 在需要更新矩阵内容之前,我需要将多个(最多1000个)向量与一个矩阵相乘。 但是,每当新的向量发送到GPU时,我必须重新分配矩阵的当前版本(由于矩阵没有改变,这非常浪费和缓慢)。 我希望能够将矩阵与向量相乘,而无需为每个向量重新分配矩阵。 我所涉及的一个想法是调用一个单独的C函数,它将矩阵分配给GPU,返回指向Fortran主程序的指针,然后调用执行矩阵向量乘法的另一个C函数。 使用ISO_C_BINDING,我向变量返回一个指向浮点数的指针: type(C_PTR) :: ptr 当我尝试将其传递给矩阵向量C函数时: 在Fortran call cudaFunction(ptr,vector, N) 在C. extern “C” void cudaFunction_(float *mat, float *vector, int *N) 一切都编译并运行,但是cublasSgemv的执行无法执行。 关于为什么会发生这种情况的任何想法? 我已经看到了一些相关的post,但他们从未尝试将返回的指针发送回C,这就是(我相信)我遇到的问题。 提前致谢!

应该如何将多个Fortran字符串传递给C?

要将Fortran字符串传递给C,还会使用变量的大小传递隐藏参数。 这是一个有效的fortran定义,以及C(实际上是C ++ / CLI)方法: interface subroutine AppendExtension( + Filename) + bind(C, name=”AppendExtension”) character *1, intent(inout):: Filename end subroutine AppendExtension end interface 这是被调用的C ++ / CLI: extern “C” { void __declspec(dllexport) __cdecl AppendExtension( char * name, int buffersize) { String^ clistr = gcnew String(name); clistr = System::IO::Path::ChangeExtension(clistr->Trim(), gcnew String(“OUT”)); IntPtr p = Marshal::StringToHGlobalAnsi(clistr); char *pNewCharStr […]