Opencl 占用所有GPGPU内存并为所有数据段调用内核
我需要在GPGPU内存允许的范围内分配尽可能多的struct Things,并为每个struct Thing调用内核 OpenCL不允许一次分配所有CL\u设备\u全局内存大小内存-您最多可以为每个分配分配CL\u设备\u最大内存大小。第二个内存通常是所有内存的4倍。所以我决定创建4个缓冲区 此外,在OpenCL内核内以及从主机向内核传递参数时,不能使用指向指针的指针,因此不能向内核传递缓冲区数组(因为每个缓冲区都是指向数组中第一个结构对象的指针) 到目前为止,我的内核代码如下:Opencl 占用所有GPGPU内存并为所有数据段调用内核,opencl,opencl-c,Opencl,Opencl C,我需要在GPGPU内存允许的范围内分配尽可能多的struct Things,并为每个struct Thing调用内核 OpenCL不允许一次分配所有CL\u设备\u全局内存大小内存-您最多可以为每个分配分配CL\u设备\u最大内存大小。第二个内存通常是所有内存的4倍。所以我决定创建4个缓冲区 此外,在OpenCL内核内以及从主机向内核传递参数时,不能使用指向指针的指针,因此不能向内核传递缓冲区数组(因为每个缓冲区都是指向数组中第一个结构对象的指针) 到目前为止,我的内核代码如下: kernel
kernel void workWithThings(
constant uint64_t t1Count,
global struct Thing * t1,
constant uint64_t t2Count,
global struct Thing * t2,
constant uint64_t t3Count,
global struct Thing * t3,
constant uint64_t t4Count,
global struct Thing * t4
)
{
private ulong gid = get_global_id( 0 );
private struct Thing * t;
if ( gid > t1Count )
{
gid -= t1Count;
if ( gid > t2Count )
{
gid -= t2Count;
if ( gid > t3Count )
{
gid -= t3Count;
t = & t4[ gid ];
}
else
{
t = & t3[ gid ];
}
}
else
{
t = & t2[ gid ];
}
}
else
{
t = & t1[ gid ];
}
//do the actual work:
//t->...
}
这真的是唯一的方法吗?我觉得写这样的代码很愚蠢。请帮助。为什么需要分配所有内存?您不能成批执行处理吗?如果你有CL 2.0,你可以使用指针。@kanna这个任务就像神经网络应用程序,神经元越多越好,所以我想填满所有的内存。主机每秒10次注入若干字节的输入数据,GPGPU用它的神经元尽可能多地咀嚼数据,并每秒10次输出若干字节。全局内存从未打算加载到主机或从主机加载。目前它是OpenCL 1.1:(GPU在计算/复制重叠时更好。这意味着它在飞行中执行多次时性能更好,除非没有主机交互。@huseyintugrulbuyukisik如果可以的话,我会尝试将GPGPUhost读/写与计算重叠。谢谢你。