首页 > 解决方案 > 将 af::array 转换为 af_array 并返回

问题描述

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

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

这是因为 SiaNet 和 ArrayFire 的C# API没有实现该batchFunc功能。

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

问题是我只能af_array从 C# 使用,但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;
    }
}

标签: c#c++arrayfire

解决方案


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

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

您还可以af::arrayaf_arrayusing构造一个af::array(some_af_array)

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

推荐阅读