首页 > 解决方案 > GPU 上 Numba 的主要测试

问题描述

我知道主要测试的实现并不是最好的,尝试在实践中使用它来使用 CUDA。我不明白为什么该文件无法编译。请不要给我一个主要测试的解决方案,因为我有兴趣学习自己。

import numpy as np
from numba import jit, cuda


@cuda.jit()
def seive(array):
    i = cuda.grid(1)
    k = 2
    while k <= math.sqrt(array[i]):
        if array[i] % k == 0:
            array[i]
            break
        k += 1


size = 20
arr = np.array([i for i in range(0, size)], np.float64)
print(arr)
seive[4, 5](arr)
print(arr)

输出:

[ 0.  1.  2.  3.  4.  5.  6.  7.  8.  9. 10. 11. 12. 13. 14. 15. 16. 17.
 18. 19. 20.]
Traceback (most recent call last):
  File "C:/Users/PycharmProjects/EulerProjectGPU/main.py", line 20, in <module>
    seive[4, 5](arr)
  File "C:\Users\anaconda3\envs\EulerProjectGPU\lib\site-packages\numba\cuda\compiler.py", line 769, in __call__
    return self.dispatcher.call(args, self.griddim, self.blockdim,
  File "C:\Users\anaconda3\envs\EulerProjectGPU\lib\site-packages\numba\cuda\compiler.py", line 861, in call
    kernel = self.compile(argtypes)
  File "C:\Users\anaconda3\envs\EulerProjectGPU\lib\site-packages\numba\cuda\compiler.py", line 935, in compile
    kernel.bind()
  File "C:\Users\anaconda3\envs\EulerProjectGPU\lib\site-packages\numba\cuda\compiler.py", line 576, in bind
    self._func.get()
  File "C:\Users\anaconda3\envs\EulerProjectGPU\lib\site-packages\numba\cuda\compiler.py", line 446, in get
    ptx = self.ptx.get()
  File "C:\Users\anaconda3\envs\EulerProjectGPU\lib\site-packages\numba\cuda\compiler.py", line 415, in get
    ptx = nvvm.llvm_to_ptx(self.llvmir, arch=arch,
  File "C:\Users\anaconda3\envs\EulerProjectGPU\lib\site-packages\numba\cuda\cudadrv\nvvm.py", line 525, in llvm_to_ptx
    ptx = cu.compile(**opts)
  File "C:\Users\anaconda3\envs\EulerProjectGPU\lib\site-packages\numba\cuda\cudadrv\nvvm.py", line 232, in compile
    self._try_error(err, 'Failed to compile\n')
  File "C:\Users\anaconda3\envs\EulerProjectGPU\lib\site-packages\numba\cuda\cudadrv\nvvm.py", line 250, in _try_error
    self.driver.check_error(err, "%s\n%s" % (msg, self.get_log()))
  File "C:\Users\anaconda3\envs\EulerProjectGPU\lib\site-packages\numba\cuda\cudadrv\nvvm.py", line 140, in check_error
    raise exc
numba.cuda.cudadrv.error.NvvmError: Failed to compile

<unnamed> (44, 19): parse expected comma after load's type
NVVM_ERROR_COMPILATION

Process finished with exit code 1```

标签: pythoncudanumba

解决方案


当我在注释 ( array[i] = 0) 中进行更改并添加import math(这显然是必要的)时,您的代码似乎对我来说运行正确:

$ cat t56.py
import numpy as np
from numba import jit, cuda
import math

@cuda.jit()
def seive(array):
    i = cuda.grid(1)
    k = 2
    while k <= math.sqrt(array[i]):
        if array[i] % k == 0:
            array[i] = 0
            break
        k += 1


size = 20
arr = np.array([i for i in range(0, size)], np.float64)
print(arr)
seive[4, 5](arr)
print(arr)
$ python t56.py
[ 0.  1.  2.  3.  4.  5.  6.  7.  8.  9. 10. 11. 12. 13. 14. 15. 16. 17.
 18. 19.]
[ 0.  1.  2.  3.  0.  5.  0.  7.  0.  0.  0. 11.  0. 13.  0.  0.  0. 17.
  0. 19.]
$

推荐阅读