Конвертировать af :: array в af_array и обратно - PullRequest
2 голосов
/ 20 марта 2020

Я бы хотел использовать библиотеку 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 ++ и хотел бы попросить вас о помощи здесь.

...