【发布时间】:2016-09-08 23:03:43
【问题描述】:
情况: 在 Metal 内核函数中,线程组中的每个线程一次读取完全相同的值。内核伪代码:
kernel void foo(device int2* ranges,
constant float3& readonlyBuffer,
device float* results,
uint lno [[ threadgroup_position_in_grid ]])
{
float acc = 0.0;
for(int i=ranges[lno].x; i<ranges[lno].y; i++) {
// each thread in threadgroup processes the same value from the buffer
acc += process( readonlyBuffer[i] );
}
results[...] = acc;
}
问题:为了优化缓冲区读取,我将readonlyBuffer的地址空间限定符从device改为constant。尽管Apple documentation 表示不同,但这对内核性能的影响为零:
常量地址空间针对执行图形或内核函数的多个实例访问缓冲区中的同一位置进行了优化。
问题:
- 如何提高常量缓冲区的内存读取时间?
- 我可以将缓冲区(或至少一部分)移动到片上缓存(类似于Constant Buffer Preloading(第 24 页))吗?
【问题讨论】:
标签: ios ios10 metal compute-shader