【发布时间】:2021-11-30 17:18:54
【问题描述】:
使用int d[1]; 尝试以下代码时,它可以正常工作,但使用int d[in_integer]; 或int c[in_matrix[0]]; 会导致nvcc 编译失败。我可以看看是否有人可以建议为什么?是否可以在pycuda中声明数组,其大小由函数参数值决定?
import pycuda.driver as cuda
import pycuda.autoinit
from pycuda.compiler import SourceModule
import os
import numpy as np
_path = r"D:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.28.29910\bin\Hostx64\x64"
if os.system("cl.exe"):
os.environ['PATH'] += ';' + _path
if os.system("cl.exe"):
raise RuntimeError("cl.exe still not found, path probably incorrect")
a = np.asarray([1, 2])
a = a.astype(np.int32)
a_gpu = cuda.mem_alloc(a.nbytes)
cuda.memcpy_htod(a_gpu, a)
b = np.zeros(1).astype(np.int32)
b_gpu = cuda.mem_alloc(b.nbytes)
cuda.memcpy_htod(b_gpu, b)
mod = SourceModule("""
__global__ void array_declaration(int *in_matrix, int *out_matrix, int in_integer)
{
int d[1];
//int d[in_integer];
//int d[in_matrix[0]];
out_matrix[0] = in_matrix[0];
}
""")
func = mod.get_function("array_declaration")
func(a_gpu, b_gpu, np.int32(1), block=(1,1,1))
b_out = np.empty_like(b)
cuda.memcpy_dtoh(b_out, b_gpu)
print(b_out)
错误如下
Traceback (most recent call last):
File "D:\PythonProjects\TradeAnalysis\Test\TestCUDAArrayDeclaration.py", line 37, in <module>
""")
File "D:\ProgramData\Anaconda3\lib\site-packages\pycuda\compiler.py", line 291, in __init__
arch, code, cache_dir, include_dirs)
File "D:\ProgramData\Anaconda3\lib\site-packages\pycuda\compiler.py", line 254, in compile
return compile_plain(source, options, keep, nvcc, cache_dir, target)
File "D:\ProgramData\Anaconda3\lib\site-packages\pycuda\compiler.py", line 137, in compile_plain
stderr=stderr.decode("utf-8", "replace"))
CompileError: nvcc compilation of C:\Users\HENRYC~1\AppData\Local\Temp\tmpy0kcq_5i\kernel.cu failed
【问题讨论】:
-
你能分享一下你那里的编译错误吗?
-
C++ 以及扩展的 CUDA 不支持动态大小的数组。它们必须是静态大小的。这就是代码无法编译的原因