Opencl 占用所有GPGPU内存并为所有数据段调用内核

Opencl 占用所有GPGPU内存并为所有数据段调用内核,opencl,opencl-c,Opencl,Opencl C,我需要在GPGPU内存允许的范围内分配尽可能多的struct Things,并为每个struct Thing调用内核 OpenCL不允许一次分配所有CL\u设备\u全局内存大小内存-您最多可以为每个分配分配CL\u设备\u最大内存大小。第二个内存通常是所有内存的4倍。所以我决定创建4个缓冲区 此外,在OpenCL内核内以及从主机向内核传递参数时,不能使用指向指针的指针,因此不能向内核传递缓冲区数组(因为每个缓冲区都是指向数组中第一个结构对象的指针) 到目前为止,我的内核代码如下: kernel

我需要在GPGPU内存允许的范围内分配尽可能多的struct Things,并为每个struct Thing调用内核

OpenCL不允许一次分配所有CL\u设备\u全局内存大小内存-您最多可以为每个分配分配CL\u设备\u最大内存大小。第二个内存通常是所有内存的4倍。所以我决定创建4个缓冲区

此外,在OpenCL内核内以及从主机向内核传递参数时,不能使用指向指针的指针,因此不能向内核传递缓冲区数组(因为每个缓冲区都是指向数组中第一个结构对象的指针)

到目前为止,我的内核代码如下:

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读/写与计算重叠。谢谢你。