【发布时间】:2015-06-30 08:57:58
【问题描述】:
我是 GPU 开发的新手,我想知道有多少工人(线程)同时执行我的内核,所以我在内核下面使用
kernel void helloWorld(global int* result)
{
int gid = 0;
gid = get_local_id(0);
if (gid > result[0])
{
result[0] = gid;
}
}
但在核心 i7 上运行时,英特尔结果 [0] 始终为 0 ;当在 nvidia GPU 上运行时,它总是 0
【问题讨论】:
-
可以通过为本地工作组大小指定 NULL 来留给运行时。但是,此代码不正确,因为对
result[0]的访问不是原子的。所有线程都将读取初始值(如果您在运行内核之前清除缓冲区,则可能为 0)然后写入它们的值,这会导致竞争条件。相反,让每个工作项将其本地 ID 写入由其全局 ID 索引的缓冲区位置。结果因设备而异。
标签: opencl