2013-03-01 1 views
4

배열을 열 주요 순서로 저장하는 언어로 작업한다고 가정합니다. 또한 2 차원 배열을 인수로 사용하여이를 반환하는 함수가 있다고 가정합니다. 행렬 연산 대신 열 단위 연산을 사용하기 위해 함수를 호출 할 때이 배열을 조인하는 것이 일반적으로 도움이되는지 (또는 그렇지 않은지) 궁금합니다. 또는 이항 변환은 열 단위 작업의 이점? I n x p 치수, 즉를 갖는다 y라는 클래스의 TS 오브젝트가 R의 예로서 열 단위 연산을 사용하기 위해 배열을 조 변경하는 것이 유리합니까?

는 I 길이 n p의 시간 시리즈가있다. 포트란 (처럼 R)를 열 현명한 스토리지를 사용하기 때문에

do i = 1, n 
    do j= 1, p 
    !just an example, some row-wise operations on `y` 
    x(i,j) = a*y(i,j) 
    D = ddot(m,y(i,1:p),1,b,1) 
    ! ... 
    end do 
end do 

, 더 나은 것 :

이 나는 ​​구조의 다음과 같은 종류의 두 개의 루프가 포트란에서 y와 함께 몇 가지 계산을 할 필요가 그 대신 계산을 p x n 배열로합니다. 그래서 그 대신

out<-.Fortran("something",y=array(y,dim(y)),x=array(0,dim(y))) 
ynew<-out$out$y 
x<-out$out$x 

의 나는 포트란 서브 루틴 something2

do i = 1, n 
    do j= 1, p 
    !just an example, some column-wise operations on `y` 
    x(j,i) = a*y(j,i) 
    D = ddot(m,y(1:p,i),1,b,1) 
    ! ... 
    end do 
end do 

같은 접근법의 선택을 하는가 될 경우 항상 크기 n에 의존하고 p 또는이다

out<-.Fortran("something2",y=t(array(y,dim(y))),x=array(0,dim(y)[2:1])) 
ynew<-t(out$out$y) 
x<-t(out$out$x) 

사용할 수 있습니다 하나의 접근법이 계산 속도 및/또는 메모리 요구 사항면에서 더 낫다고 말할 수 있습니까? 내 응용 프로그램에서 n은 일반적으로 p보다 훨씬 큽니다. 대부분의 경우 1에서 10입니다. 당신은 본질적으로

y(1:p,i) 

단순히 Y에 대한 포인터 (1 같이 두 번째 방법을 사용하도록 강요 될 것이다 오래된 학교 F77 아래 : 주석의

+0

많은 경우에 루프의 순서를 교환 할 수 있습니다. 거기에 어떤 의존성이 있습니까? –

+0

예, 순환 순서를 다루고 있으므로 루프 순서를 변경할 수 없다는 점을 잊어 버렸습니다. –

+0

이것이 실제로 문제가됩니까? R이 해석되기 때문에 어쨌든 1-2 배 정도 느려지므로 Fortran에서 10 % 미만의 시간을 보내고 있다면 해결할 수있는 시간이 더 많을 가능성이 있습니다. –

답변

3

더, 내가 코드의 비트를 넣어 원 구매 i), 다음 p 값은 메모리에서 인접합니다.

제 제물

y(i,1:p) 

메모리에 interspaced 값 목록이므로 서브 루틴에 전달하는 데이터의 사본을 요구할 것으로 보인다. 내가 현대적인 최적화 컴파일러가 어떻게 이런 것들을 다루는 지 안 좋은 생각이 없기 때문에 나는 그것이라고 말할 수있다. 나는이 옷을 최악의 상태로 씻는 것이 가장 좋다고 생각하는 경향이 있습니다. 배열이 너무 커서 전체 벡터에 액세스하기 위해 페이지를 스왑해야한다고 상상해보십시오. 이 대답 할 수있는 유일한 방법

결국

은 스스로를 테스트하는 것입니다

---------- 편집 조금 TestNG를 않았다 내 직감 확인 : 대 비용을 부담 않습니다 y(i,1:p) 통과 행 전달 열 y(1:p,i). 나는 그 차이를보기 위해 실질적으로 아무것도하지 않는 서브 루틴을 사용했다. 어떤 실제 서브 루틴이든 내 추측은 무시할 만합니다.행이 인하에 다른 모든 값을 전달하면서

, BTW 전체 열을 전달하는 대신

y(1:p:2,i)이 오래 걸립니다 열에 (크기 순서를)마다 다른 값을 전달 (그리고 어쩌면이에 어떤 일이 일어나는지 이해하는 데 도움이됩니다) 전체 행을 통과하는 데 비해 절반의 시간.

(gfortran12 .. 사용)

관련 문제