Библиотека С++ AMP с С#: как хранить данные в памяти графического процессора?

Допустим, у меня есть программа, которая генерирует большой случайно заполненный целочисленный массив и позволяет мне проверять количество элементов, кратных некоторому введенному пользователем числу, используя для этой цели GPU.
c# code

[DllImport("AMP.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
public static extern int RunTest(int* CPUinput, int length, int num);
static void Main(string[] args)
{
    Random rnd = new Random();
    int[] arr = new int[10000000];
    for (int i = 0; i < arr.Length; i++)
        arr[i] = rnd.Next(1, int.MaxValue);
    fixed (int* arrPtr = &arr[0])
    {
        while (true)
        {
            int num = int.Parse(Console.ReadLine());
            Console.WriteLine($"There are {RunTest(arrPtr, arr.Length, num)} numbers in array divisible by {num}");
        }
    }
}

С++ код

extern "C" { __declspec(dllexport) int RunTest(int* input, int length, int num); }
int RunTest(int* CPUinput, int length, int num)
{
    int CPUresult[1];
    CPUresult[0] = 0;
    array_view<int, 1> GPUinput(length, CPUinput);
    array_view<int, 1> GPUresult(1, CPUresult);
    parallel_for_each(GPUinput.get_extent(), [=](index<1> idx) restrict(amp) {
        if (GPUinput[idx[0]] % num == 0)
            atomic_fetch_inc(&GPUresult[0]);
    });
    GPUinput.discard_data();
    GPUresult.synchronize();
    return CPUresult[0];
}

Очевидно, что копировать массив каждый раз, когда я запускаю тест, — плохая идея. На самом деле это узкое место в данном случае. Как я могу сохранить массив в памяти GPU среди нескольких вызовов библиотеки?


person Drobor    schedule 16.01.2016    source источник


Ответы (1)


Я сделал это, но это было давно. Вы хотели бы создать оболочку в C++ CLI и взаимодействовать с ней, чтобы в вашем коде C# было что-то, на что он может поддерживать ссылку и, таким образом, сохранять выделенную память на графическом процессоре.

Следующее должно помочь вам начать

оболочка C++/CLI для нативного C++ для использования в качестве эталона в C#

person Ade Miller    schedule 28.07.2016