我知道在内核中只有调用__device__
函数的限制。这可以防止我在内核中调用标准函数,如strcmp()
等。
在这一点上,我无法理解/找到原因。在内核中内联调用strcmp()
的时候,编译器是不是只能跟在strings.h等内部?我想我寻找的原因很简单,我在这里错过了一些东西。
它是重新实现我在内核计算中需要的所有函数和数据类型的唯一方法吗?有这样的重新实现的代码库吗?CUDA:在内核中调用库函数
回答
是的,从内核使用stdlib函数的唯一方法是重新实现它们。但我强烈建议你重新考虑这个想法,因为它是高度不太可能你需要运行在GPU上使用strcmp()
的代码。请添加有关您的问题的更多详细信息,以便提出更好的解决方案(我非常怀疑在GPU上串行字符串比较是您真正需要的)。
这是几乎不可能简单地重新编译所有STDLIB的GPU,因为它在很大程度上取决于某些系统调用(如内存分配),这可能不是GPU使用(当然,在最新版本的CUDA工具包你可以的从内核中分配设备内存,但它不是“cuda-way”,仅由最新的硬件支持,并且对性能不利(很)。 此外,大多数功能的CPU版本对于GPU来说远非“好”。因此,绝大多数情况下,编译GPU的普通CPU功能都不会导致问题,所以编译器甚至不会尝试它。
这是一个普遍的问题,因为我需要在我最近的CUDA项目中使用一个或两个标准函数。目前我尝试在GPU上创建字典,因此我至少需要一个strcpy() – Callahan
@Callahan有一些STL移植到CUDA的推文库,但它没有字符串处理能力, GPUish任务。在每个线程中使用具有不同迭代次数的循环对性能不利。散列查找(int32或int64比较)更好,并且可以在CPU上使用相同散列的字符串中执行'strcmp()'。它还可以节省设备内存。 – aland
这确实是一个好主意。只要我只想查找单词......这将节省大量的内存!但是,如何计算一个小于2^64的长(15个字)单词的不可信的散列? – Callahan
标准功能如strcmp()
尚未针对CUDA架构进行编译。我还没有看到CUDA的任何标准C库。
- 1. 调用Cuda内核中的Opencv函数
- 2. CUDA:从内核调用__device__函数
- 3. CUDA内核函数
- 4. 在CUDA内核中使用虚函数
- 5. 如何在CUDA内核中调用主机函数?
- 6. 在内核中调用cublas函数时编译CUDA代码
- 7. 我可以从CUDA内核函数调用__device__函数吗?
- 8. 调试CUDA内核
- 9. CUDA - 多次调用内核
- 10. CUDA中的多个内核调用
- 11. 从Python内核调用C++ CUDA设备函数
- 12. CUDA内核调用来自内循环
- 13. CUDA内核参数
- 14. cuda内核里面的函数
- 15. 性能损失调用CUDA内核
- 16. 问题调用模板CUDA内核
- 17. 内核调用CUDA上的流延迟
- 18. CUDA内核函数中的内存访问(简单示例)
- 19. Cuda内核函数在多个文件中
- 20. 如何在CUDA中同步我自己的内核函数?
- 21. CUDA内核的参数
- 22. 在CUDA内核中使用cublasStbsv
- 23. 在CUDA内核memcpy调用中使用array [i] [j]
- 24. 如何获取CUDA内核函数中数组的大小?
- 25. 从C调用cuda函数
- 26. CUDA内核中的STD类
- 27. 内核中的CUDA流ID
- 28. CUDA中的嵌套内核
- 29. cuda nsight visual studio版内核调试
- 30. CUDA内核挂起
如果您觉得您需要在CUDA内核中使用C库函数,那么您可能*错过了GPGPU编程的要点。 –
'strcmp()'是一个简单的函数。当然你可以为你的目的写一个等价物。 – stardt
'strcmp()'的示例代码可在http://en.wikipedia.org/wiki/Strcmp – stardt