PyCUDA认为53 * 53 == 2808

问题描述 投票:0回答:1

我尝试使用pycuda如下计算53 * 53

import numpy as np
import pycuda.gpuarray as gpuarray
import pycuda.autoinit

a = gpuarray.to_gpu(np.array([53]))
print((a**2).get()[0])

即打印出2808,而真正的答案是2809。我哪里出错了?

python cuda pycuda
1个回答
0
投票

打印出2808,而真正的答案是2809

不,不是:

$ cat ohnoitdoesnt.py 
import numpy as np
import pycuda.gpuarray as gpuarray
import pycuda.autoinit

a = gpuarray.to_gpu(np.array([53]))
print((a**2).get()[0])

$ python ohnoitdoesnt.py 
Traceback (most recent call last):
  File "ohnoitdoesnt.py", line 6, in <module>
    print((a**2).get()[0])
  File "/usr/local/lib/python2.7/dist-packages/pycuda-2017.1.1-py2.7-linux-x86_64.egg/pycuda/gpuarray.py", line 659, in __pow__
    return self._pow(other,new=True)
  File "/usr/local/lib/python2.7/dist-packages/pycuda-2017.1.1-py2.7-linux-x86_64.egg/pycuda/gpuarray.py", line 643, in _pow
    func = elementwise.get_pow_kernel(self.dtype)
  File "<string>", line 2, in get_pow_kernel
  File "/usr/local/lib/python2.7/dist-packages/pycuda-2017.1.1-py2.7-linux-x86_64.egg/pycuda/tools.py", line 430, in context_dependent_memoize
    result = func(*args)
  File "/usr/local/lib/python2.7/dist-packages/pycuda-2017.1.1-py2.7-linux-x86_64.egg/pycuda/elementwise.py", line 559, in get_pow_kernel
    "pow_method")
  File "/usr/local/lib/python2.7/dist-packages/pycuda-2017.1.1-py2.7-linux-x86_64.egg/pycuda/elementwise.py", line 161, in get_elwise_kernel
    arguments, operation, name, keep, options, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/pycuda-2017.1.1-py2.7-linux-x86_64.egg/pycuda/elementwise.py", line 147, in get_elwise_kernel_and_types
    keep, options, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/pycuda-2017.1.1-py2.7-linux-x86_64.egg/pycuda/elementwise.py", line 75, in get_elwise_module
    options=options, keep=keep)
  File "/usr/local/lib/python2.7/dist-packages/pycuda-2017.1.1-py2.7-linux-x86_64.egg/pycuda/compiler.py", line 291, in __init__
    arch, code, cache_dir, include_dirs)
  File "/usr/local/lib/python2.7/dist-packages/pycuda-2017.1.1-py2.7-linux-x86_64.egg/pycuda/compiler.py", line 255, in compile
    return compile_plain(source, options, keep, nvcc, cache_dir, target)
  File "/usr/local/lib/python2.7/dist-packages/pycuda-2017.1.1-py2.7-linux-x86_64.egg/pycuda/compiler.py", line 137, in compile_plain
    stderr=stderr.decode("utf-8", "replace"))
pycuda.driver.CompileError: nvcc compilation of /tmp/tmpaeIBGe/kernel.cu failed
[command: nvcc --cubin -arch sm_52 -I/usr/local/lib/python2.7/dist-packages/pycuda-2017.1.1-py2.7-linux-x86_64.egg/pycuda/cuda kernel.cu]
[stderr:
kernel.cu(19): error: calling a __host__ function("std::pow<long, long> ") from a __global__ function("pow_method") is not allowed

kernel.cu(19): error: identifier "std::pow<long, long> " is undefined in device code

2 errors detected in the compilation of "/tmp/tmpxft_00001674_00000000-6_kernel.cpp1.ii".
]

这不是unknown problem in CUDA-CUDA数学库不会重载大多数函数的整数参数版本。

如果我们解决此问题并使用浮点类型,它将按预期工作:

$ cat ohnoitdoesnt.py 
import numpy as np
import pycuda.gpuarray as gpuarray
import pycuda.autoinit

a = gpuarray.to_gpu(np.array([53], dtype=np.float32))
print((a**2).get()[0])

$ python ohnoitdoesnt.py 
2809.0
© www.soinside.com 2019 - 2024. All rights reserved.