我将在GPU上运行,例如strcmp
函数,但我得到:
error: calling a host function("strcmp") from a __device__/__global__ function("myKernel") is not allowed
printf
可能不起作用,因为gpu没有stdout,但是strcmp之类的函数可以工作!那么,我应该在代码中插入strcmp
来自库__device__
前缀或者什么的实现?
答案 0 :(得分:2)
CUDA有一个标准库,在CUDA编程指南中有记录。它包括支持它的设备的printf()(Compute Capability 2.0和更高版本),以及assert()。但是,此时它不包括完整的字符串或stdio库。
如Jason R. Mick所建议的那样实现自己的标准库可能是可能的,但不一定是可取的。在某些情况下,将序列标准库中的函数简单地移植到CUDA可能是不安全的 - 尤其是因为其中一些实现并不是线程安全的(例如,Windows上的rand())。即使它是安全的,也可能效率不高 - 它可能并不是你所需要的。
在我看来,最好避免在CUDA中避免使用非官方支持的标准库函数。如果您需要在并行代码中使用标准库函数的行为,请首先考虑您确实是否需要它: *你真的要并行进行数千次strcmp操作吗? *如果没有,你有比较长度数千字符的字符串吗?如果是这样,请考虑使用并行字符串比较算法。
如果您确定在并行CUDA代码中确实需要标准库函数的行为,那么请考虑如何(安全有效地)并行实现它。
答案 1 :(得分:0)
希望这至少能帮助到一个人:
由于 CUDA 中没有 strcmp 函数,所以我们必须自己实现:
__device__ int my_strcmp (const char * s1, const char * s2) {
for(; *s1 == *s2; ++s1, ++s2)
if(*s1 == 0)
return 0;
return *(unsigned char *)s1 < *(unsigned char *)s2 ? -1 : 1;
}