2014-11-28 2 views
1

저는 현재 pycuda와 scikits.cuda를 사용하여 선형 방정식 A * x = b를 풀고 있습니다. 여기서 A는 상한/하한 행렬입니다. 그러나 cublasStbsv 루틴에는 특정 형식이 필요합니다. 예를 들어, 더 낮은 행렬 A = [[1, 0, 0], [2, 3, 0], [4,5,6]]이면 cublasStbsv에 필요한 입력은 [[1, 3, 6], [2, 5, 0], [4, 0, 0]]의 행을 포함하고, 여기서 행은 각각 대각선, subdiagonal1, subdiagonal2이다. numpy를 사용하는 경우 stride_tricks.as_strided에서 쉽게 수행 할 수 있지만 pycuda.gpuarray를 사용하여 비슷한 작업을 수행하는 방법을 알지 못합니다. 어떤 도움을 주시면 감사하겠습니다. pycuda.compyte.array.as_strided를 발견했지만 gpuarray에 적용 할 수 없습니다.상단/하단 gpuarray를 cublasStbsv에서 요구하는 특정 형식으로 변환하는 방법은 무엇입니까?

답변

1

나는 theano를 사용하여 작업을 완료했습니다. 먼저 그것을 cudandarray로 변환하고, 보폭을 바꾸고 gpuarray로 복사본을 만듭니다. Fortran과 C 사이의 변경 사항에주의하십시오. 업데이트 : 매트릭스가 너무 큰 경우 결국이 방법에 문제가있다 gpuarray.multi_take_put

def make_triangle(s_matrix, uplo = 'L'): 
"""convert triangle matrix to the specific format 
required by cublasStbsv, matrix should be in Fortran order, 
s_matrix: gpuarray  
""" 
#make sure the dytpe is float32  
if s_matrix.dtype != 'f': 
    s_matrix = s_matrix.astype('f') 
dim = s_matrix.shape[0] 
if uplo == 'L': 
    idx_tuple = np.tril_indices(dim) 
    gidx = gpuarray.to_gpu(idx_tuple[0] + idx_tuple[1] * dim) 
    gdst = gpuarray.to_gpu(idx_tuple[0] + idx_tuple[1] * (dim - 1)) 
    return gpuarray.multi_take_put([s_matrix], gdst, gidx, (dim, dim))[0] 
else: 
    idx_tuple = np.triu_indices(dim) 
    gidx = gpuarray.to_gpu(idx_tuple[0] + idx_tuple[1] * dim) 
    gdst = gpuarray.to_gpu(idx_tuple[0] + (idx_tuple[1] + 1) * (dim - 1)) 
    return gpuarray.multi_take_put([s_matrix], gdst, gidx, (dim, dim))[0] 
+0

을 사용하여 수행되었다가, 다음, 다음 오류를 제공합니다 진보가 cudandarray가 점유 메모리에 액세스 할 수 있도록 변경 –

관련 문제