【发布时间】:2015-02-06 23:55:18
【问题描述】:
我正在为 CUDA 内核函数编写一个包装器来管理线程分配,以隐藏 GPU 中的线程限制。 发生的情况是,由于 CUDA 有线程限制,用户将不得不编写一个程序来管理线程。我要做的是对用户隐藏线程限制,以便他可以在任意数量的线程中运行他的内核。
基本思路是这样的:
void launch_cuda_kernel_matrix(void (*func)(void*), void* param, unsigned int dim_x, unsigned int dim_y) {
while (! all threads run) {
do stuff ...
fake_func<<max_x, max_y>>(func, param, current_run);
}
}
void fake_func(void (*func)(void*), void* param, unsigned int current_run) {
blockIdx.x = blockIdx.x (some math) current_run;
threadIdx.x = threadIdx.x (some math) current run;
func(param);
}
所以基本上我的计划是通过更改当前线程的线程和块索引来欺骗内核,然后从我的包装器中调用具有最大可用线程数的函数(我最终将我的架构概括为允许多个尺寸)
问题是,CUDA 不允许我更改线程和块索引。 有办法解决吗?
另外,将参数传递给 func 而不必诉诸 void* 的最佳方法是什么?
【问题讨论】:
-
也许只有我一个人,但我发现几乎不可能理解你想要达到的目标。你能说出你的确切目标、预期结果和观察到的结果吗?
-
将索引计算移动到全局函数中,并将索引和dim传递给设备函数。您要么需要全局函数具有固定的分区方案,要么使用原子请求下一个工作块。
-
我正在尝试做一个 API,以便用户可以运行任意数量的线程并且 API 将处理这些作业。
-
@Jean-LucNacifCoelho 你打算如何支持
__syncthreads()?
标签: c++ c multithreading cuda