2017-01-30 12 views
1

arrayfire pow documentation에 따르면 af.pow()은 현재 실제 배열의 힘 (및 근음 ...) 만 지원합니다. 오류가 발생하지 않지만 복소수 입력을 사용하여 af.pow()을 사용하면 다른 함수가 입력으로 사용되는 경우 (예 : af.pow(af.ifft(array), 2)) 큰 메모리 누수가 발생할 수 있음을 발견했습니다.Arrayfire를 사용하여 Python에서 복잡한 배열을보다 빠르게 지수화합니다

이 문제를 해결하기 위해 아래에 함수 complexPow을 작성했습니다. 이것은 메모리 누수가없는 복잡한 배열에서 실행되는 것으로 보이며 빠른 비교를 통해 내 complexPow 함수는 numpy.sqrt()** 연산자와 같은 값을 반환합니다.

def complexPow(inData, power): 
    for i in af.ParallelRange(inData.shape[0]): 
     theta = af.atan(af.imag(inData[i])/af.real(inData[i])) 
     rSquared = af.pow(af.real(inData[i]), 2.0) + \ 
        af.pow(af.imag(inData[i]), 2.0) 
     r = af.pow(rSquared, .5) 
     inData[i] = af.pow(r, power) * (af.cos(theta*power) + \ 
       1j*af.sin(theta*power)) 
    return inData 

더 빠른 방법으로 병렬 요소 단위 지수 연산을 수행 할 수 있습니까? 나는 하나를 찾았지만, 내가 여기에 트릭을 ... 누락 무서워하지 않은

이 조금 더 빠른 병렬 for 루프없이
+1

이것은 분명히 버그처럼 들립니다. [github] (https://github.com/arrayfire/arrayfire-python/issues)에서이를 신고 할 수 있습니까? – aatish

+0

예. 나는 그렇게 생각했다. 내일 할거야. 메모리 누수를 보여주는 최소한의 작업 예제가 있습니다. –

답변

0

:와 dtype=complex 배열을 통해

def complexPow(inData, power): 
    theta = af.atan(af.imag(inData)/af.real(inData)) 
    r = af.pow(af.pow(af.real(inData), 2.0) + 
       af.pow(af.imag(inData), 2.0), .5) 
    inData = af.pow(r, power) * (af.cos(theta*power) + \ 
       1j*af.sin(theta*power)) 
    return inData 

Tetsted 4000 반복에 대한 엔비디아 쿼드로 K4200, 스파이더 3, 파이썬 2.7, 윈도우 7을 사용하여 치수 (1, 2**18) : af.ParallelRange를 사용

: 7.64 초 (반복 당 1.91 밀리 초).

위의 방법 : 5.94 초 (반복 당 1.49 밀리 초).

속도 증가 : 28 %.