我尝试在GPU代码(OpenCL / C ++内核)中执行系统命令,就像这样
system("ngspice");
但是我收到了这条ERROR消息:CL_INVALID_BINARY。
我发现一些问题,说不允许在内核中调用外部函数!
OPENCL: OpenCL - is it possible to invoke another function from within a kernel?
CUDA: CUDA External calls not supported
如果我没错,那是OPENCL / CUDA限制之一:
OpenCL:https://www.khronos.org/registry/cl/sdk/1.0/docs/man/xhtml/restrictions.html
CUDA:http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#functions
我是对的吗?这种限制背后的原因是什么?
答案 0 :(得分:5)
因为它完全没有意义。您尝试调用的系统在GPU上不存在。您无法在GPU上调用外部程序。尝试通过system
调用程序或shell是完全没有意义的。
答案 1 :(得分:2)
CPU和GPU是完全不同的计算机体系结构,具有完全不同的指令集。为一个编写的程序不能在另一个上运行。
当您使用CUDA或OpenCL在GPU上运行程序时,您基本上是在另一台计算机上运行它。它无法访问主机所执行的所有资源:它无法访问硬盘驱动器,也无法在网络上进行通信,也无法使用主机操作系统提供的任何其他服务。所有GPU代码都可以修改内存中的数据。
system("ngspice")
不起作用,因为:
"ngspice"
是硬盘驱动器上程序的名称,但GPU无法与硬盘驱动器进行交互,答案 2 :(得分:1)
GPU环境中没有system
(就像Puppy所说)。如果要根据内核的计算结果执行system
函数,可以从内核中写入输出变量,并在主机代码中使用它来确定它是否应该运行{{1}是否打电话。