我是Numba的初学者。我很难在GPU中重新排列数组的行。
例如,在Numba CPU中,这可以通过
from numba import njit
import numpy as np
@njit
def numba_cpu(A, B, ind):
for i, t in enumerate(ind):
B[i, :] = A[t, :]
ind = np.array([3, 2, 0, 1, 4])
A = np.random.rand(5, 3)
B = np.zeros((5, 3))
numba_cpu(A, B, ind)
但是它不适用于cuda.jit
我试过运行这段代码
@cuda.jit
def arr():
a = np.array([1., 2., 3., 4.], dtype=np.float32)
arr()
但是它导致了这个错误-- TypingError: Failed in nopython mode pipeline (step: nopython frontend) Use of unsupported NumPy function 'numpy.array' or unsupported use of the function. --我不明白为什么会发生这种情况,难道cuda.jit不应该支持大
我正在尝试使用numba.cuda在GPU上运行任意的渐近lambdify函数。到目前为止,由于numba.jit允许函数返回值,但numba.cuda.jit不允许返回值(numba.cuda.jit内核不能返回值),我在每一步都会遇到错误。这可能源于我对numba工作方式的根本误解,但文档中的示例有些稀少,我尝试修改每个给定的示例,试图做我想做的事情,但没有结果。
我尝试过的例子:
非数据自动化系统jit函数(works)
import sympy
from sympy.abc import y
import numba
f = sympy.lambdify(y, sympy.sin(y
我使用numba在python中编写了测试代码。
from numba import cuda
import numpy as np
import numba
@cuda.jit
def function(output, size, random_array):
i_p, i_k1, i_k2 = cuda.grid(3)
a=cuda.local.array(shape=1,dtype=numba.float64)
if i_p<size and i_k1<size and i_k2<size:
a1=i_p
a2=i
我在这里运行一个jupyter笔记本:
当前numba/cuda的文档在这里:
我在python中的numba.cuda中运行这一行:
from numba import cuda
from numba import *
我有一个mandel函数如下:
@jit
def mandel(x, y, max_iters):
"""
Given the real and imaginary parts of a complex number,
determine if it is a candidate for membership in the Mand
有几个线程涉及类似的主题,但不幸的是,这些内容对我来说似乎太复杂了,所以我想问一个类似的问题,希望有人专门看一下我的代码,告诉我如果我做错了什么。
我现在正在学习numba,从网上可以找到的简单例子开始。我从这里开始学习这个教程:
它显示了如何并行地添加数组。他们用来评估时间的系统配置没有给出。对于代码复制,我使用Geforce GTX 1080 Ti和Intel Core i7 8700K CPU。
我基本上复制了教程中的加法脚本,但也添加了顺序代码以进行比较:
from numba import cuda
import numpy as np
import time
import mat
我需要能够调用GPU函数,而GPU函数本身又间接调用另一个GPU函数:
from numba import cuda, jit
import numpy as np
# GPU function
@cuda.jit(device = True)
def euclidean_distance_gpu(input_vec, weight, diffs):
i = cuda.grid(1)
if i < input_vec.shape[0]:
diffs[i] = (input_vec[i] - weight[i]) ** 2
@jit
# CPU function
def
我知道numba会创建一些间接费用,在某些情况下(非密集计算),纯python会变得更慢。但我不知道的是在哪里划界线。是否可以用算法复杂度的顺序来确定在哪里?
例如,为了添加两个数组(~O(n)),在这段代码中,纯python比5更短:
def sum_1(a,b):
result = 0.0
for i,j in zip(a,b):
result += (i+j)
return result
@numba.jit('float64[:](float64[:],float64[:])')
def sum_2(a,b):
我正在玩concurrent.futures.ThreadPoolExecutor,看我是否能从我的四核处理器(有8个逻辑核)中挤出更多的工作。因此,我编写了以下代码:
from concurrent import futures
def square(n):
return n**2
def threadWorker(t):
n, d = t
if n not in d:
d[n] = square(n)
def master(n, numthreads):
d = {}
with futures.ThreadPoolExecuto
我在实验如何使用numba内部的cuda。然而,我遇到了一些与我期望不同的事情。这是我的密码
from numba import cuda
@cuda.jit
def matmul(A, B, C):
"""Perform square matrix multiplication of C = A * B
"""
d=cuda.local.array((3,3),dtype=numba.float64)
i, j = cuda.grid(2)
if i < C.shape[0] and j < C.shape[1]:
tmp
我使用numba库中的装饰器@jit优化了一些python代码。但是,我想指示@jit显式地使用我的GPU设备。出发地:,我知道我需要使用@jit(target="cuda")来完成它。
我试着这样做:
from numba import jit, cuda
@jit(target='cuda') # The code runs normally without (target='cuda')
def function(args):
# some code
我得到了以下错误:
KeyError: "Unrecognized o
我正在尝试在CUDA GPU上运行这段简单的代码。我使用的模块是numba.cuda import numba
from numba import cuda
@numba.cuda.jit
def function_4(j, k):
l = j + k
return l
l = function_4(1, 2)
print(l) 输出: Traceback (most recent call last):
File "/home/amu/Desktop/RL_framework/help_functions/test2.py", line 9, in
我正在研究如何最好地比较使用numba编译的python函数中的字符串(没有python模式,python 3)。
用例如下:
import numba as nb
@nb.jit(nopython = True, cache = True)
def foo(a, t = 'default'):
if t == 'awesome':
return(a**2)
elif t == 'default':
return(a**3)
else:
...
但是,将返回以下错误:
In
我在numba和普通模式下尝试了这段代码,但两者都在13秒内完成,numba没有增加速度。
我怎么才能让numba适应这种情况?
import numpy as np
from numba import jit, cuda
a=[]
@jit(target_backend="cuda")
def func():
for i in range(100000):
a.append(i)
return a
print(func())
我正在试着写一个简单的函数来测试为什么numba.cuda不能工作。该函数应将变量设置为固定值。当我调用这个函数时,它似乎被编译了,但什么也没发生。我补充说,它应该引发一个异常,只是为了看看它被调用了,但同样什么也没有发生。我没有得到任何类型的异常来给我一个提示,为什么它不工作。
功能:
from numba import cuda
@cuda.jit # also tried it with brackets: @cuda.jit()
def cuda_func(out):
out = 1
raise NameError('MyException'
我用numba cuda来计算一个函数。
代码只是将所有的值加到一个结果中,但是numba给出了与numpy不同的结果。
numba码
import math
def numba_example(number_of_maximum_loop,gs,ts,bs):
from numba import cuda
result = cuda.device_array([3,])
@cuda.jit(device=True)
def BesselJ0(x):
return math.sqrt(2/math.pi/x)
我使用Numba0.46.0,我想将类中的一个对象作为参数传递给我的函数,并使用CUDA在我的GPU上运行这个函数。如果我想使用一个简单的Python (比如int),我会使用如下内容:
from numba import jit, cuda
from numba.types import void, int32
@jit(void(int32), target='cuda')
def f(int_object):
pass
f(123)
这个很好用。现在我试着对一个类做同样的事情:
from numba import jit, cuda
from numba,ty
假设我有两个向量,想取它们的点积,这很简单,
import numpy as np
a = np.random.rand(3)
b = np.random.rand(3)
result = np.dot(a,b)
如果我有一堆向量,并且希望每个向量都被点缀,最天真的代码是
# 5 = number of vectors
a = np.random.rand(5,3)
b = np.random.rand(5,3)
result = [np.dot(aa,bb) for aa, bb in zip(a,b)]
对此计算进行分批的两种方法是使用乘法和求和,和e_ sum,
result = n
在这个(哑巴)例子中,我试图通过计算落入单位圆的(0,1) x (0,1)中随机选择的点的数量来计算π。
@guvectorize(['void(float64[:], int32, float64[:])'], '(n),()->(n)', target='cuda')
def guvec_compute_pi(arr, iters, res):
n = arr.shape[0]
for t in range(n):
inside = 0
for i in range(iters):
我知道如何使用np.array或np.zeros或np.empty(shape, dtype)在主机中创建全局设备函数,然后使用cuda.to_device复制。
另外,还可以将共享数组声明为cuda.shared.array(shape, dtype)。
但是如何在gpu函数中特定线程的寄存器中创建一个恒定大小的数组。
我试过cuda.device_array或np.array,但都没有用。
我只想在线程里做这个-
x = array(CONSTANT, int32) # should make x for each thread
x_cpu,y_cpu,z_cpu是等长的大数组,结果是网格结果,会降低x,y,z分辨率,每个网格只保留一个点,它们不能一起放到内存中。所以我将x,y,z分成几个部分,但仍然将整个结果放入使用的GPU内存中
from numba import cuda
from math import ceil
SegmentSize = 1000000
Loops = ceil(len(x_cpu),SegmentSize)
Result = cuda.device_array((maxX-minX,maxY-minY))
for lopIdx in range(Loops):
x = cuda.