2011-09-05 128 views
1

我知道在内核中只有调用__device__函数的限制。这可以防止我在内核中调用标准函数,如strcmp()等。
在这一点上,我无法理解/找到原因。在内核中内联调用strcmp()的时候,编译器是不是只能跟在strings.h等内部?我想我寻找的原因很简单,我在这里错过了一些东西。
它是重新实现我在内核计算中需要的所有函数和数据类型的唯一方法吗?有这样的重新实现的代码库吗?CUDA:在内核中调用库函数

+2

如果您觉得您需要在CUDA内核中使用C库函数,那么您可能*错过了GPGPU编程的要点。 –

+2

'strcmp()'是一个简单的函数。当然你可以为你的目的写一个等价物。 – stardt

+1

'strcmp()'的示例代码可在http://en.wikipedia.org/wiki/Strcmp – stardt

回答

3

是的,从内核使用stdlib函数的唯一方法是重新实现它们。但我强烈建议你重新考虑这个想法,因为它是高度不太可能你需要运行在GPU上使用strcmp()的代码。请添加有关您的问题的更多详细信息,以便提出更好的解决方案(我非常怀疑在GPU上串行字符串比较是您真正需要的)。

这是几乎不可能简单地重新编译所有STDLIB的GPU,因为它在很大程度上取决于某些系统调用(如内存分配),这可能不是GPU使用(当然,在最新版本的CUDA工具包你可以的从内核中分配设备内存,但它不是“cuda-way”,仅由最新的硬件支持,并且对性能不利()。 此外,大多数功能的CPU版本对于GPU来说远非“好”。因此,绝大多数情况下,编译GPU的普通CPU功能都不会导致问题,所以编译器甚至不会尝试它。

+1

这是一个普遍的问题,因为我需要在我最近的CUDA项目中使用一个或两个标准函数。目前我尝试在GPU上创建字典,因此我至少需要一个strcpy() – Callahan

+1

@Callahan有一些STL移植到CUDA的推文库,但它没有字符串处理能力, GPUish任务。在每个线程中使用具有不同迭代次数的循环对性能不利。散列查找(int32或int64比较)更好,并且可以在CPU上使用相同散列的字符串中执行'strcmp()'。它还可以节省设备内存。 – aland

+0

这确实是一个好主意。只要我只想查找单词......这将节省大量的内存!但是,如何计算一个小于2^64的长(15个字)单词的不可信的散列? – Callahan

2

标准功能如strcmp()尚未针对CUDA架构进行编译。我还没有看到CUDA的任何标准C库。