2014-11-11 4 views
0

Я пытаюсь запустить ядро ​​cuda в python numbapro, но я продолжаю получать ошибку из-за нехватки ресурсов. Затем я попытался выполнить ядро ​​в цикле и отправить меньшие массивы, но это все равно дало мне ту же ошибку.Cuda из-за нехватки ресурсов при запуске python numbapro

Вот мое сообщение об ошибке:

Traceback (most recent call last): 
File "./predict.py", line 418, in <module> 
predict[griddim, blockdim, stream](callResult_d, catCount, numWords, counts_d, indptr_d, indices_d, probtcArray_d, priorC_d) 
File "/home/mhagen/Developer/anaconda/lib/python2.7/site-packages/numba/cuda/compiler.py", line 228, in __call__ 
sharedmem=self.sharedmem) 
File "/home/mhagen/Developer/anaconda/lib/python2.7/site-packages/numba/cuda/compiler.py", line 268, in _kernel_call 
cu_func(*args) 
File "/home/mhagen/Developer/anaconda/lib/python2.7/site-packages/numba/cuda/cudadrv/driver.py", line 1044, in __call__ 
self.sharedmem, streamhandle, args) 
File "/home/mhagen/Developer/anaconda/lib/python2.7/site-packages/numba/cuda/cudadrv/driver.py", line 1088, in launch_kernel 
None) 
File "/home/mhagen/Developer/anaconda/lib/python2.7/site-packages/numba/cuda/cudadrv/driver.py", line 215, in safe_cuda_api_call 
self._check_error(fname, retcode) 
File "/home/mhagen/Developer/anaconda/lib/python2.7/site-packages/numba/cuda/cudadrv/driver.py", line 245, in _check_error 
raise CudaAPIError(retcode, msg) 
numba.cuda.cudadrv.driver.CudaAPIError: Call to cuLaunchKernel results in CUDA_ERROR_LAUNCH_OUT_OF_RESOURCES 

Вот мой исходный код:

from numbapro.cudalib import cusparse 
from numba import * 
from numbapro import cuda 

@cuda.jit(argtypes=(double[:], int64, int64, double[:], int64[:], int64[:], double[:,:], double[:])) 
def predict(callResult, catCount, wordCount, counts, indptr, indices, probtcArray, priorC): 

    i = cuda.threadIdx.x + cuda.blockIdx.x * cuda.blockDim.x 

    correct = 0 
    wrong = 0 
    lastDocIndex = -1 
    maxProb = -1e6 
    picked = -1 

    for cat in range(catCount): 

     probSum = 0.0 

     for j in range(indptr[i],indptr[i+1]): 
      wordIndex = indices[j] 
      probSum += (counts[j]*math.log(probtcArray[cat,wordIndex])) 

     probSum += math.log(priorC[cat]) 
     if probSum > maxProb: 
      maxProb = probSum 
      picked = cat 

    callResult[i] = picked 

predictions = [] 
counter = 1000 
for i in range(int(math.ceil(numDocs/(counter*1.0)))): 
    docTestSliceList = docTestList[i*counter:(i+1)*counter] 
    numDocsSlice = len(docTestSliceList) 
    docTestArray = np.zeros((numDocsSlice,numWords)) 
    for j,doc in enumerate(docTestSliceList): 
     for ind in doc: 
      docTestArray[j,ind['term']] = ind['count'] 
    docTestArraySparse = cusparse.ss.csr_matrix(docTestArray) 

    start = time.time() 
    OPT_N = numDocsSlice 
    blockdim = 1024, 1 
    griddim = int(math.ceil(float(OPT_N)/blockdim[0])), 1 

    catCount = len(music_categories) 
    callResult = np.zeros(numDocsSlice) 
    stream = cuda.stream() 
    with stream.auto_synchronize(): 
     probtcArray_d = cuda.to_device(numpy.asarray(probtcArray),stream) 
     priorC_d = cuda.to_device(numpy.asarray(priorC),stream) 
     callResult_d = cuda.to_device(callResult, stream) 
     counts_d = cuda.to_device(docTestArraySparse.data, stream) 
     indptr_d = cuda.to_device(docTestArraySparse.indptr, stream) 
     indices_d = cuda.to_device(docTestArraySparse.indices, stream) 
     predict[griddim, blockdim, stream](callResult_d, catCount, numWords, counts_d, indptr_d, indices_d, probtcArray_d, priorC_d) 

     callResult_d.to_host(stream) 
    #stream.synchronize() 
    predictions += list(callResult) 

    print "prediction %d: %f" % (i,time.time()-start) 
+0

Не должно ли это быть сообщение об ошибке поставщику этого частичного продукта? – talonmies

ответ

1

я узнал, что это в порядке Cuda.

При вызове предсказать blockdim установлен в 1024. предсказать [griddim, blockdim, поток] (callResult_d, CATCount, numWords, counts_d, indptr_d, indices_d, probtcArray_d, priorC_d)

Но процедура называется итеративно с размером среза 1000 элементов, а не 1024. Итак, в процедуре будет предпринята попытка записать 24 элемента, которые находятся за пределами массива return.

Отправка ряда параметров элементов (n_el) и размещение вызова проверки ошибок в процедуре cuda решает ее.

@cuda.jit(argtypes=(double[:], int64, int64, int64, double[:], int64[:], int64[:], double[:,:], double[:])) 
def predict(callResult, n_el, catCount, wordCount, counts, indptr, indices, probtcArray, priorC): 

    i = cuda.threadIdx.x + cuda.blockIdx.x * cuda.blockDim.x 

    if i < n_el: 

     .... 
Смежные вопросы