【发布时间】:2013-05-13 08:16:26
【问题描述】:
我有几个 CUDA 内核,它们基本相同,但有一些变化。我想做的是减少所需的代码量。我的第一个想法是使用宏,所以我得到的内核看起来像这样(简化):
__global__ void kernelA( ... )
{
INIT(); // macro to initialize variables
// do specific stuff for kernelA
b = a + c;
END(); // macro to write back the result
}
__global__ void kernelB( ... )
{
INIT(); // macro to initialize variables
// do specific stuff for kernelB
b = a - c;
END(); // macro to write back the result
}
...
由于宏令人讨厌、丑陋和邪恶,我正在寻找一种更好、更清洁的方法。有什么建议吗?
(switch 语句无法完成这项工作:实际上,相同的部分和内核特定的部分非常交织在一起。需要几个 switch 语句,这会使代码变得非常不可读。此外,函数调用不会初始化所需的变量。)
(这个问题可能也适用于一般 C++,只需将所有 'CUDA kernel' 替换为 'function' 并删除 '__global__' )
【问题讨论】:
-
上课?职能?结构编程?
-
我们需要更多详细信息来帮助您。如果可以选择切换,@talonmies 对this question 的回答可能会对您有所帮助。
-
OOP 通常会回答“几个 switch 语句 [...] 这会使代码非常难以阅读。”使用“创建对象层次结构并将开关分支拆分为类特化”。为什么那行不通?
-
谁告诉你宏是肮脏、丑陋和邪恶的?它们是 C 语言最好的特性之一。不要害怕使用它们。嗯,嗯,你也有 C++ 模板。