gpt4 book ai didi

c++ - CUDA如何欺骗内核认为它在另一个线程中?

转载 作者:行者123 更新时间:2023-11-28 06:26:50 25 4
gpt4 key购买 nike

我正在为 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 中,您可以简单地运行大量线程,这在大多数情况下就足够了:

  • 计算能力 1.x - 65535 x 1024 线程
  • 计算能力 2.0+ - 65535 x 65535 x 65535 x 1024 线程

另一种方法是将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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com