CUDA 如何欺骗内核认为它在另一个线程中?
CUDA how to trick the kernel into thinking it's in another thread?
我正在为 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* 的最佳方法是什么?
嗯,我认为一般来说很难
实现你的目标。但是,从您的问题中我可以得出结论,您的函数func
线程之间没有数据依赖关系(每个线程处理自己的部分,并且与其他线程没有交互(。还假设func
处理 1 个维度(或 2 个维度(。由于这在 CUDA 中,您可以简单地运行大量线程,在大多数情况下就足够了:
- 计算能力 1.x - 65535 x 1024 线程
- 计算能力 2.0+ - 65535 x 65535 x 65535 x 1024 线程
另一种方法是将func
签名更改为 void (*func)(int i, void*)
,因此该函数将处理i
部分数据。对于多个维度,您还可以更改签名void (*func)(int i, int j, int k, void*)
。在我看来,这应该是可取的,因为__device__
函数也可以声明为 __host__
,您可以在 CPU 中并行运行它。
void*
问题,我可以建议在C++(+可变参数模板(中使用模板,但在 C 中没关系。
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 在另一个线程中调用luaL_error会引发qWarning
- 最佳做法是从另一个线程访问 qml 中的Q_PROPERTY
- C++线程:如何在一个线程仍在运行时阻止另一个线程执行 (Win32)
- 结束另一个线程中使用的对象的生存期
- 从不同进程中的另一个线程挂起/恢复线程或进程
- 两个线程一个使用流 Api,另一个线程创建文件失败并出现错误ERROR_SHARING_VIOLATION
- 计时器是否从另一个线程启动?
- 互斥,Windows 10,c ++,在一个线程上获取,在另一个线程上发布
- Qt 在另一个线程中无限循环
- 在销毁期间从另一个线程调用对象上调用方法是否未定义行为?
- 从另一个线程发出信号是否安全?
- AMQP-CPP,libev >停止ev_loop来自另一个线程
- 在没有任何锁的情况下加入另一个线程后是否需要内存围栏?
- ::grpc::ServerReaderWriter 对象在另一个线程中一段时间后无法调用
- 如何在 qt 中从另一个线程运行 qt并发时关闭程序
- C++将互斥锁锁定为来自另一个线程
- QTcpSocket:消息不是从另一个线程发送的
- 如何从另一个线程调用颤振引擎方法
- 在另一个线程上发出 QObject 信号的正确方法?