gpt4 book ai didi

c# - GPU全局内存计算

转载 作者:太空宇宙 更新时间:2023-11-03 22:53:16 25 4
gpt4 key购买 nike

在最坏的情况下,这个样本是否在 GPU 全局内存中分配了 testCnt * xArray.Length 存储?如何确保只有一份数组副本传输到设备? GpuManaged 属性似乎可以达到这个目的,但它并没有解决我们意外的内存消耗问题。

void Worker(int ix, byte[] array)
{
// process array - only read access
}

void Run()
{
var xArray = new byte[100];
var testCnt = 10;
Gpu.Default.For(0, testCnt, ix => Worker(ix, xArray));
}

编辑

更精确形式的主要问题:是每个工作线程都获得一份新的 xArray 副本,还是所有线程都只有一份 xArray 副本?

最佳答案

您的示例代码应在 GPU 上分配 100 字节 内存,在 CPU 上分配 100 字节 内存>。(.Net 增加了一些开销,但我们可以忽略它)

由于您使用的是隐式内存,因此需要分配一些资源来跟踪该内存(基本上是它所在的位置:CPU/GPU)。

现在...我假设,您可能会在 CPU 端看到更大的内存消耗。

其原因可能是由于内核编译在运行中发生。AleaGPU 必须将您的 IL 代码编译成 LLVMLLVM 被送入 Cuda 编译器,后者又将其转换为 PTX。当您第一次运行内核时会发生这种情况。所有资源和非托管 dll 都加载到内存中。

这就是您所看到的可能

testCnt 对分配的内存量没有影响。

编辑*

一个建议是以明确的方式使用内存。它更快、更高效:

    private static void Run()
{
var input = Gpu.Default.AllocateDevice<byte>(100);
var deviceptr = input.Ptr;

Gpu.Default.For(0, input.Length, i => Worker(i, deviceptr));

Console.WriteLine(string.Join(", ", Gpu.CopyToHost(input)));
}

private static void Worker(int ix, deviceptr<byte> array)
{
array[ix] = 10;
}

关于c# - GPU全局内存计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46549352/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com