如何解决初始化组共享变量的最佳实践
我正在使用一个大的 groupshared 变量来进行计算,但最近我发现(艰难的方法)没有初始化 groupshared 内存。 对于我的用例,我需要对其进行初始化,因为我将在所有计算后将其直接复制回纹理。
所以我问有什么更好的方法来解决这个问题?主要是性能方面,因为我认为初始化必须作为整个着色器程序的一部分发生。
这是我目前处理它的方式,但它似乎没有按预期工作,因为某些数据在下一次调度中仍然存在。基本上每个线程都被分配了许多要初始化的值,然后等待其他线程。
#define GroupSize 64
#define FoWMap_Size 4096
groupshared uint _FoWMap[FoWMap_Size];
[numthreads(GroupSize,1,1)]
void FOWMapGenerator(uint3 id : SV_DispatchThreadID)
{
uint instPerThread = FoWMap_Size / GroupSize;
[unroll]
for (uint k = 0; k < instPerThread; k++)
{
uint realID = (id.x * instPerThread) + k;
if (realID > FoWMap_Size)
break;
_FoWMap[realID] = 0;
}
//wait for all units to finish
GroupMemoryBarrierWithGroupSync();
...
...
...
}
这是我事先快速而草率的方法:
void InitArray(uint size)
{
for (uint i = 0; i < size; i++)
{
_FoWMap[i] = 0;
}
}
[numthreads(GroupSize,1)]
void FOWMapGenerator(uint3 id : SV_DispatchThreadID)
{
InitArray(FoWMap_Size);
...
...
...
}
但是我放弃了这个,因为理论上这意味着每个线程都在完全初始化 groupshared 数组,这在性能方面并不理想。 编译器可能正在为我优化它,但我不确定。
总而言之,您如何初始化组共享数组?我迫切需要建议。
解决方法
在您的情况下初始化组共享内存时,您应该使用 SV_GroupThreadID
,组内的本地线程 ID,而不是 SV_DispatchThreadID
,跨组的全局线程 ID。
否则,您将超出第二组及以上数组索引的范围。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。