python - 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```
解决方案
当我在注释 ( 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.]
$
推荐阅读
- java - org.hibernate.MappingException:未知实体:com.travelplanner.rest.entity.User
- sql - 如何修复 ORA-00933 命令未正确结束错误
- c# - 添加失败
到 ObservableCollection。未找到元素错误 - python-3.x - python chromedirver 不会退出
- doctrine - 使用学说获取日期时间差异
- docker - 查看 Portainer 运行的命令
- java - ExecutorCompletionService 核心java类中使用的设计模式
- python - 使用 cookiejar 删除 cookie / 结束会话
- sql - 与另一个实体有关系的列被截断
- android - RxJava/RxKotlin 抱怨访问视图