让我们暂时假设私有作用域中堆满了无法删除的变量,添加其他私有变量会导致寄存器溢出。但是,我们仍然需要更多的临时变量,因此我们决定将它们分配到本地内存中。我们事先知道1)有多少本地内存可用,2)工作组大小不变。
有没有办法声明一个工作项(不是工作组)特定的本地内存对象?
工作项不会与其他工作项共享结果,它只是需要它自己。
我目前唯一能想到的方法就是包含丑陋的东西:
local uint dataLump[WORK_GROUP_SIZE];
local uint* myTempVar = &dataLump[get_local_id(0)];
有更好的方法吗?
答案 0 :(得分:0)
如果编译器必须溢出专用寄存器而不是全局内存,编译器应该足够聪明地使用本地内存。
但是如果没有发生(我不信任驱动程序开发人员),你可以这样做:
#define L_MEM(x) x[get_local_id(0)]
local uint lvar1[WORK_GROUP_SIZE]; //Declare
//Access
uint a = b + L_MEM(lvar1);
注意我不使用指针,因为它将在整个组中共享,并被所有WI覆盖。您必须使用WI_id直接访问。宏选项在那里是一个很好的帮助。