首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GPU全局内存计算

GPU全局内存计算
EN

Stack Overflow用户
提问于 2017-10-03 16:31:29
回答 2查看 505关注 0票数 1

在最坏的情况下,这个示例是否在GPU全局内存中分配testCnt * xArray.Length存储?如何确保只将数组的一个副本传输到设备上?GpuManaged属性似乎满足了这个目的,但它不能解决我们意想不到的内存消耗问题。

代码语言:javascript
复制
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副本?

EN

回答 2

Stack Overflow用户

发布于 2017-10-04 00:31:29

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

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

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

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

这就是,可能是你看到的东西。

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

编辑*

一个建议是以显式方式使用内存。其速度更快、效率更高:

代码语言:javascript
复制
    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;
    }
票数 2
EN

Stack Overflow用户

发布于 2017-10-04 09:40:44

尝试使用显式内存:

代码语言:javascript
复制
static void Worker(int ix, byte[] array)
{
    // you must write something back, note, I changed your Worker
    // function to static!
    array[ix] += 1uy;
}

void Run()
{
    var gpu = Gpu.Default;
    var hostArray = new byte[100];
    // set your host array
    var deviceArray = gpu.Allocate<byte>(100); 
    // deviceArray is of type byte[], but deviceArray.Length = 0, 
    assert deviceArray.Length == 0
    assert Gpu.ArrayGetLength(deviceArray) == 100
    Gpu.Copy(hostArray, deviceArray);
    var testCnt = 10;
    gpu.For(0, testCnt, ix => Worker(ix, deviceArray));
    // you must copy memory back
    Gpu.Copy(deviceArray, hostArray);
    // check your result in hostArray
    Gpu.Free(deviceArray);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46549352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档