在最坏的情况下,这个示例是否在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副本?
发布于 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对分配的内存量没有影响。
编辑*
一个建议是以显式方式使用内存。其速度更快、效率更高:
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;
}发布于 2017-10-04 09:40:44
尝试使用显式内存:
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);
}https://stackoverflow.com/questions/46549352
复制相似问题