将 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);`
我想使用 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);`