带有 c# 的 c++ AMP 库:如何将数据保存在 GPU 内存中
本文关键字:保存 数据 存在 GPU 内存 c++ AMP 带有 | 更新日期: 2023-09-27 18:30:37
假设我有一个程序,它生成大的随机填充整数数组,并允许我检查可被某个用户输入的数字整除的项目数量,为此目的使用 GPU。
C# 代码
[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}");
}
}
}
C++ 代码
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 内存中?
我已经这样做了,但那是很久以前的事了。您可能希望在 CLI 中创建包装器并与之互操作C++以便您的 C# 代码具有可以维护引用的内容,从而在 GPU 上分配内存。
以下内容应该可以帮助您入门
C++/CLI 包装器,供本机C++用作 C# 中的参考