c# - 将 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;
}
}
解决方案
一个af::array
实例有一个方法.get()
,您可以从中检索一个af_array
实例。
af::array some_array = ...;
af_array c_array = some_array.get();
您还可以af::array
从af_array
using构造一个af::array(some_af_array)
。
af::array another_array = af::array(c_array);`
推荐阅读
- arrays - 根据元素唯一性和其他条件删除 np 数组行
- r - R gt_table 调整行高
- elasticsearch - 如何为多节点设置弹性搜索快照存储库?
- ansible - 如何在 Ansible 中嵌套 with_filetree?
- swiftui - 在 Picker 标签中使用隐藏 ProgressView 时崩溃
- c# - 在悬停时应用光标样式后丢失以前的组合框项目样式
- reactjs - React:正确使用 useCallback 钩子?
- postgresql - 无法写入 postgres
- r - 当不存在的组合时
- haskell - Stephen Diehl 的“使用 Haskell 和 LLVM 实现 JIT 编译语言”在 MacOS 上安装失败