Следующий код имитирует извлечение двоичных слов из разных мест в пределах набора изображений.Функция Numba медленнее, чем C++ и повторный порядок циклов далее замедляется x10
Numba обернут функцию, wordcalc в коде ниже, имеет 2 проблемы:
- Это в 3 раза медленнее по сравнению с аналогичной реализации в C++.
- Как ни странно, если вы переключаете порядок «ibase» и «ibit» для петель, скорость падает в 10 раз (!). Это не происходит в реализации C++, которая остается незатронутой.
Я использую Numba 0.18-2 из WinPython 2.7
Что может быть причиной этого?
imDim = 80
numInsts = 10**4
numInstsSub = 10**4/4
bitsNum = 13;
Xs = np.random.rand(numInsts, imDim**2)
iInstInds = np.array(range(numInsts)[::4])
baseInds = np.arange(imDim**2 - imDim*20 + 1)
ofst1 = np.random.randint(0, imDim*20, bitsNum)
ofst2 = np.random.randint(0, imDim*20, bitsNum)
@nb.jit(nopython=True)
def wordcalc(Xs, iInstInds, baseInds, ofst, bitsNum, newXz):
count = 0
for i in iInstInds:
Xi = Xs[i]
for ibit in range(bitsNum):
for ibase in range(baseInds.shape[0]):
u = Xi[baseInds[ibase] + ofst[0, ibit]] > Xi[baseInds[ibase] + ofst[1, ibit]]
newXz[count, ibase] = newXz[count, ibase] | np.uint16(u * (2**ibit))
count += 1
return newXz
ret = wordcalc(Xs, iInstInds, baseInds, np.array([ofst1, ofst2]), bitsNum, np.zeros((iInstInds.size, baseInds.size), dtype=np.uint16))
Я предполагаю, что разница в производительности при переключении порядка цикла имеет какое-то отношение к кэш-памяти. –
@LakshayGarg Я думал то же самое, но реализация на C++ не чувствительна к этому вообще. – Leo
Очень маловероятно, но, возможно, компилятор достаточно умен, чтобы оптимизировать это для вас. Какой компилятор вы используете? –