代码之家  ›  专栏  ›  技术社区  ›  ZHANG Juenjie

如何在numba中正确索引。库达?

  •  0
  • ZHANG Juenjie  · 技术社区  · 6 年前

    我正在编写一段代码,需要使用numba在python中进行一些索引。 然而,我不能正确地做到这一点。 似乎有些东西是被禁止的。 代码如下:

    from numba import cuda
    import numpy as np
    @cuda.jit
    def function(output, size, random_array):
        i_p, i_k1, i_k2 = cuda.grid(3)
        if i_p<size and i_k1<size and i_k2<size:
            a1=i_p**2+i_k1
            a2=i_p**2+i_k2
            a3=i_k1**2+i_k2**2
            a=[a1,a2,a3]
            for i in range(len(random_array)):
                output[i_p,i_k1,i_k2,i] = a[int(random_array[i])]
    output=cuda.device_array((10,10,10,5))
    random_array=cuda.to_device(np.array([np.random.random()*3 for i in range(5)]))
    size=10
    threadsperblock = (8, 8, 8)
    blockspergridx=(size + (threadsperblock[0] - 1)) // threadsperblock[0]
    blockspergrid = ((blockspergridx, blockspergridx, blockspergridx))
    
    # Start the kernel 
    function[blockspergrid, threadsperblock](output, size, random_array)
    print(output.copy_to_host())
    

    它会产生一个错误:

    LoweringError: Failed at nopython (nopython mode backend)
    'CUDATargetContext' object has no attribute 'build_list'
    File "<ipython-input-57-6058e2bfe8b9>", line 10
    [1] During: lowering "$40.21 = build_list(items=[Var(a1, <ipython-input-57-6058e2bfe8b9> (7)), Var(a2, <ipython-input-57-6058e2bfe8b9> (8)), Var(a3, <ipython-input-57-6058e2bfe8b9> (9))])" at <ipython-input-57-6058e2bfe8b9> (10
    

    有人能帮我吗?

    一种选择是馈送a也作为函数的输入,但当a真的很大,比如1000*1000*1000*7数组时,它总是会给我释放内存。

    1 回复  |  直到 6 年前
        1
  •  1
  •   talonmies    6 年前

    这个问题与数组索引无关。在内核中,这一行:

    a=[a1,a2,a3]
    

    不支持。不能在中创建列表 @cuda.jit 作用内核中受支持的Python类型的确切列表有完整的文档记录 here .