将 af::array 转换为 af_array 并返回

Convert af::array to af_array and back

我想使用 ArrayFire 库在 GPU 上并行 运行 多个人工神经网络。

由于我主要是一名 C# 开发人员,因此我尝试通过 SiaNet 实现它。但是我遇到了SiaNet一次只能运行一个神经网络的问题。

这是因为 SiaNet 和 C# API of ArrayFire do not implement the batchFunc 功能。

我想弥补这一点,建立了自己的小图书馆。 在那里我调用了 batchFunc 函数并想要构建一个 API 可以从 C# 使用 PInvokes 调用它。

问题是我只能在C#中使用af_array,而batchFunc函数只能处理af::array。因此我需要将一个转换成另一个。

我的MatrixMultiply函数,有一个我可以传递的函数batchFunc:

af::array MatrixMultiply(const af::array &lhs, const af::array &rhs) {
    return matmul(lhs, rhs);
}

我的 PInvoke 友好函数:

af_err BatchMatmul(af_array *out, const af::array lhs, const af::array rhs) {
    try
    {
    *out = &(af::batchFunc(lhs, rhs, MatrixMultiply));

    return AF_SUCCESS;
    }
    catch (af::exception& e) {
    fprintf(stderr, "%s\n", e.what());
    return AF_ERR_BATCH;
    }
}

正如我在 C# 端所说的那样:

[DllImport("BatchOpsWrapperLib.dll", ExactSpelling = true, SetLastError = false, CallingConvention = CallingConvention.Cdecl)]
public static extern af_err BatchMatmul(out IntPtr array_out, IntPtr array_lhs, IntPtr array_rhs);

到目前为止,我几乎没有或根本没有使用过 C/C++,想在这里向您寻求帮助。

编辑: 这是我重新设计的新功能:

af_err BatchMatmul(af_array *out, const af_array lhs, const af_array rhs)
{
    try
    {
        af_array retainedLhs = 0;
        af_array retainedRhs = 0;

        af_retain_array(&retainedLhs, lhs);
        af_retain_array(&retainedRhs, rhs);

        af_array resultHandle = 0;

        af_retain_array(&resultHandle, af::batchFunc(af::array(retainedLhs),
                                                     af::array(retainedRhs),
                                                     MatrixMultiply).get());

        *out = resultHandle;

        return AF_SUCCESS;
    }
    catch (af::exception& e) {
        fprintf(stderr, "%s\n", e.what());
        return AF_ERR_BATCH;
    }
}

一个 af::array 实例有一个方法 .get(),您可以从中检索一个 af_array 实例。

af::array some_array = ...;
af_array c_array = some_array.get();

您还可以使用 af::array(some_af_array)af_array 构建 af::array

af::array another_array = af::array(c_array);`