Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opencl 工作项缓存的全局内存_Opencl - Fatal编程技术网

Opencl 工作项缓存的全局内存

Opencl 工作项缓存的全局内存,opencl,Opencl,由于本地内存的限制,我需要使用全局内存作为工作项的缓存 假设我有1000个工作组,每个工作组有64个工作项。每个项目都需要4K缓存。工作项完成后,缓存不需要持久化 我将分配一个全局内存缓冲区,并为工作项分配4K块 (我的目标是AMD GPU) 我需要保证不会出现这种情况的最小尺寸是多少 工作项之间是否存在并发问题 由于AMD有如果每个缓存项(由全局工作项ID%(64*128)访问)是一个4000字节长的结构,如果实现没有强制每个结构在4096字节上对齐,如果缓存线大小不是4000的精确除数,如果

由于本地内存的限制,我需要使用全局内存作为工作项的缓存

假设我有1000个工作组,每个工作组有64个工作项。每个项目都需要4K缓存。工作项完成后,缓存不需要持久化

我将分配一个全局内存缓冲区,并为工作项分配4K块

(我的目标是AMD GPU)

我需要保证不会出现这种情况的最小尺寸是多少 工作项之间是否存在并发问题

由于AMD有如果每个缓存项(由
全局工作项ID%(64*128)
访问)是一个4000字节长的结构,如果实现没有强制每个结构在4096字节上对齐,如果缓存线大小不是4000的精确除数,如果全局内存组跨距长度不是4000的精确除数,那就不成问题了


使用codexl分析此内核(16k工作项需要0.5秒):

\u内核无效测试(\u全局浮点*a)
{
int i=获取全局id(0)*4096;

对于(int j=0;jThanks。我的意思是缓存块为4096字节。但是,是否可以保证根据全局工作项id按特定顺序安排工作项?如果是这样,那么我可以确保没有两个工作项使用相同的缓存块。如果一个工作项可以使用计算单元中的所有行资源,那么这应该不是问题,但是我不太倾向于这样做,这样他们就更有可能并行访问。我不能对此做出任何保证。128x64是8k,因此比8k更多的工作项可以多次访问同一缓存元素(大型gpu可以在几个时钟内访问,具有4k核)谢谢。那么,你是说为了安全起见,我应该为每个工作项分配一个4096块吗?我想对多个工作项重复使用同一个缓存块,但前提是可以保证工作项不会同时访问该块。MD自己的论坛说,2的跨距的大功率是不好的。因为只使用了几行,所以它们可以y、 4000应该是好的,或者4103可能是。为了克服这些问题。但是你也可以使用交错缓存。这样,第一个工作项可以访问第一个字节,10000thbyte…..4096000字节作为所有4096字节的缓存数据。这将允许显式内存请求平衡,如果不是隐式的。非常感谢分析这些内核。我很抱歉y、 我想我可能没有清楚地解释这个问题。我每个工作组有64个工作项,所有工作项共享一个缓存缓冲区。访问被设计为在工作项之间合并读取。也就是说,每个工作项在缓存中拥有一条数组点的垂直线。因此,项0拥有0,64128,…项1拥有1,65129,所以,读取是合并的。你可以尝试用codexl分析它。它告诉你内核的必要条件,瓶颈在哪里
    __kernel void test(__global float * a)
    {
        int i=get_global_id(0)*4096;
        for(int j=0;j<4096;j++)
            a[i+j]*=2.0f;
    }
    __kernel void test(__global float * a)
    {
        int i=get_global_id(0);
        for(int j=0;j<4096;j++)
            a[i+j*4096*4]*=2.0f;
    }
__kernel void test(__global float * a)
{
    int i=get_global_id(0)*4100;
    for(int j=0;j<4100;j++)
        a[i+j]*=2.0f;
}
typedef struct test_struct
{
   float test_field[4096];
}strr;
__kernel void test(__global strr * a)
{
    int i=get_global_id(0);
    for(int j=0;j<4096;j++)
    a[i].test_field[j]*=2.0f;
}
typedef struct test_struct
{
   float test_field[4096];
}strr;
__kernel void test(__global strr * a)
{
    int iLocal=get_local_id(0);
    int iGroup=get_group_id(0);
    for(int j=0;j<64;j++)
    a[iGroup].test_field[iLocal+j*64]*=2.0f;
}