我需要在 GPGPU 内存允许的范围内分配尽可能多的struct Thing并为每个struct Thing调用内核。
OpenCL 不允许一次分配所有CL_DEVICE_GLOBAL_MEM_SIZE内存——每次分配最多可以分配CL_DEVICE_MAX_MEM_ALLOC_SIZE 。第二个通常比所有内存少4倍。所以我决定创建 4 个缓冲区。
此外,您不能在两个 OpenCL 内核中使用指向指针的指针,也不能在从主机向内核传递 args 时使用指针,因此不能将缓冲区数组传递给内核(因为每个缓冲区都是指向数组中第一个struct Thing的指针)。
到目前为止,我的内核代码是这样的:
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->...
}
这真的是唯一的方法吗?我觉得写这样的代码很愚蠢。请帮忙。