Я бы хотел использовать библиотеку ArrayFire для параллельного запуска нескольких искусственных нейронных сетей на графическом процессоре.
Поскольку я в основном разработчик C#, я попытался реализовать его с помощью Si aNet. Но я столкнулся с проблемой, что Si aNet может одновременно запускать только одну нейронную сеть.
Это потому, что Si aNet и C# API ArrayFire не реализуют batchFunc
функция.
Я хотел восполнить это и создал свою маленькую библиотеку. Там я вызываю функцию batchFunc
и хочу создать API, который можно вызывать из C# с помощью PInvokes.
Проблема в том, что я могу использовать только af_array
из C#, но * Функция 1020 * может обрабатывать только 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 ++ и хотел бы попросить вас о помощи здесь.