- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在为 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);
}
所以基本上我的计划是通过更改当前线程的线程和 block 索引来欺骗内核,然后使用最大可用线程数从我的包装器调用该函数(我最终会概括我的架构以允许多个维度)
问题是,CUDA 不允许我更改线程和 block 索引。有解决办法吗?
此外,无需求助于 void* 即可将参数传递给 func 的最佳方法是什么?
最佳答案
嗯,我认为总体上实现您的目标有点困难。但是,根据您的问题,我可以得出结论,您的函数 func
在线程之间没有数据依赖性(每个线程处理自己的部分并且不与其他线程交互)。还假设 func
处理 1 维(或者可能是 2 维)。因为在 CUDA 中,您可以简单地运行大量线程,这在大多数情况下就足够了:
另一种方法是将func
签名更改为void (*func)(int i, void*)
,这样函数将处理i
-th 部分数据。对于多个维度,您还可以更改签名 void (*func)(int i, int j, int k, void*)
。在我看来,这应该更可取,因为 __device__
函数也可以声明为 __host__
并且您可以在 CPU 中并行运行它。
对于 void*
问题,我建议在 C++ 中使用模板(+可变参数模板),但在 C 中没问题。
关于c++ - CUDA如何欺骗内核认为它在另一个线程中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28376809/
我是一名优秀的程序员,十分优秀!