1
CUDA / 改造成kernel时,参数很多,怎么办?
« 最后发表 作者 master 于 八月 30, 2023, 09:57:26 pm »想把原来在CPU下运行的子程序,改造成CUDA FORTRAN里的kernel。遇到一些问题,想请教大侠指点下。
原来的程序把变量定义在一个module里,其中还用save定义了一些全局变量。想要改造的这个子程序中用到了不少这些全局变量,有几十个。这个子程序开头use variables来使用这些全局变量,varialbes是存放这些变量的module。
这样的话,改造前这个子程序的参列表里就不需要把这些全局变量也列上,只列几个局部变量即可。
现在把子程序改造成kernel时就有点麻烦。这些全局变量是由CPU先计算好,然后调用kernel,这个kernel只是用了一下这些变量值,并不改变它们的值。
现在的改造思路是:把这些全局变量先传递到device上的相应数组,然后调用这个kernel,那么这个kernel的参数列表就将会很长(即需要把这些变量都写进去),因为kernel里不能定义全局变量。
这些全局变量在CPU里已经计算好,不再变化,调用kernel也不会导致它们变化。
kernel需要被反复调用数百次,每次调用时都有这些参数,感觉一是这个kernel后面括号的参数列表太长,也不好看。还有就是每次调用kernel都有这些参数,会不会影响效率。
不知道有没有遇到这种问题的,是如何解决的呢?遇到这种情况,该如何改造kernel?有没有办法使参数里面不写这些变量呢?
原来的程序把变量定义在一个module里,其中还用save定义了一些全局变量。想要改造的这个子程序中用到了不少这些全局变量,有几十个。这个子程序开头use variables来使用这些全局变量,varialbes是存放这些变量的module。
这样的话,改造前这个子程序的参列表里就不需要把这些全局变量也列上,只列几个局部变量即可。
现在把子程序改造成kernel时就有点麻烦。这些全局变量是由CPU先计算好,然后调用kernel,这个kernel只是用了一下这些变量值,并不改变它们的值。
现在的改造思路是:把这些全局变量先传递到device上的相应数组,然后调用这个kernel,那么这个kernel的参数列表就将会很长(即需要把这些变量都写进去),因为kernel里不能定义全局变量。
这些全局变量在CPU里已经计算好,不再变化,调用kernel也不会导致它们变化。
kernel需要被反复调用数百次,每次调用时都有这些参数,感觉一是这个kernel后面括号的参数列表太长,也不好看。还有就是每次调用kernel都有这些参数,会不会影响效率。
不知道有没有遇到这种问题的,是如何解决的呢?遇到这种情况,该如何改造kernel?有没有办法使参数里面不写这些变量呢?