2010-08-08 3 views
0

난 이차원 동적 배열을 정의 배열 arrays.Dimensions 메모리를 할당 서로 (256 * 256)와 동일하다 :는 C의 이차원 동적 배열 알고리즘 ++의 기간을 단축

double **I1,**I2; 

    int M=256; 
    int N=256; 
    int i,j; 

    I1= new double *[M+1]; 
    for(i=1;i<=M;i++) 
    {I1[i]=new double [N+1];} 

    I2= new double *[M+1]; 
    for(i=1;i<=M;i++) 
    {I2[i]=new double [N+1];} 

그럼, 배열의 값 요소를 할당했습니다. 이러한 배열에서 수학적 알고리즘을 실행해야합니다. 많은 for 루프를 사용했습니다. 그리고 코드가 매우 느리게 작동했습니다.

I가 I1에서 I2 빼기 다른 I3 이차원 배열 빼기 배열 asssigned 경우,이 코드 사용 예

:

double **I3; 
double temp; 
//allocate I3; 
I3= new double *[M+1]; 
for(i=1;i<=M;i++) 
{I3[i]=new double [N+1];} 


//I3=I1-I2 


for(i=1;i<=M;i++){ 
    for(j=1;j<=N;j++){ 
      temp=I1[i][j]-I2[i][j]; 
      I3[i][j]=temp;} 
} 

어떻게 수 I 루프를 사용하지 않고, C++ 짧은 실행 시간? 다른 방법을 알려주시겠습니까? 중요한 순서대로

베스트 감사합니다 ..

답변

2

: 컴파일러 최적화에

  • 전환합니다.
  • 각 행렬에 대해 하나의 배열을 할당하고 M * i + j와 같은 것을 색인에 사용하십시오. 이것은 더 빠르고 더 중요한 것은 다중 할당보다 더 작고 단편화 될 것입니다.
  • 0부터 시작하는 인덱싱에 익숙해지면 하나의 배열 요소가 저장되며 일반적으로 0 비교가 더 빠를 가능성이 있습니다.
  • for 루프를 사용할 때 잘못된 점이 없습니다.
  • 더 많은 노력을 기울이려면 벡터화 된 타사 선형 대수학 라이브러리를 사용하거나 SSE * 또는 GPU를 사용하여 벡터화하십시오.
+0

+1 단일 배열을 할당합니다. 'new'에 대한 모든 호출은 아마도 사소한 루프가 아니라 문제의 근원 일 것입니다. – strager

1

일부 아키텍처는 단일 명령어가 double 배열의 모든 요소를 ​​합산하는 벡터 산술 연산을 지원합니다.

그러나 프로그램 속도를 높이려면 먼저 측정해야합니다. 경기 침체가 발생하는 곳을보기 위해 프로그램 시간을 정했습니까?

예를 들어, for 루프에서 수행하는 것으로 보이는 한 가지 일은 많은 경향이있는 힙 할당입니다. 더 빠른 속도를 위해 모든 배열을 하나의 배열로 결합 할 수 있습니다. 당신이 이런 짓을하면

I3 = I1 - I2; 

:

현재이의 논리적 상당을하고

I1 -= I2; 

지금 I1는 결과를 저장하는 것입니다. 이것은 I1의 원래 값을 파괴하지만 새로운 배열 배열을 할당하는 것을 피할 것입니다.

또한 C++의 의도는 클래스를 정의하여 데이터 유형과 조작을 나타 내기위한 것입니다. 따라서 동적 배열 스토리지를 나타내는 클래스를 작성할 수 있습니다. 또는 기존의 것을 사용하십시오. uBLAS library을 확인하십시오.

1

왜 이것이 매우 느린 지 이해할 수 없습니다. 여기에 256 * 256 빼기를하고 있습니다.나는 여기에 루프를 피할 방법이 있다고 생각하지 않는다. (비록 당신이 매트릭스 라이브러리를 사용하고있다하더라도 아마 여전히 같은 것을 할 것이다).

새로운 256 번 호출 대신 하나의 이동에서 256 * 256 수레를 할당하는 것을 고려해 볼 수 있습니다. 그런 다음 하나의 인덱스 만 있기 때문에 색인 생성 산술을 사용합니다. 그렇지만이 작업을 수행하는 매트릭스 라이브러리를 찾는 것이 더 쉽습니다. .

+0

내 알고리즘에서는 많은 빼기, 곱셈 배열을 사용해야합니다. 예제 만 제공합니다. 도움을 주셔서 감사합니다. – yalcin

2

우선, 대부분의 경우 수동으로 이와 같은 메모리를 관리하지 않는 것이 좋습니다. C++이 "알고리즘"을 적용 할 수있는 컨테이너 클래스를 제공한다고 들었을 것입니다. 이러한 컨테이너는 오류가 발생하기 쉽고 (특히 예외의 경우) 연산이 표현력이 뛰어나고 최적화되어 있으며 일반적으로 잘 테스트되어 있으므로 작동이 입증됩니다.

이전에 알려진 배열의 크기를 사용하면 성능이 저하되지 않고 (생성시 제외) std :: vector를 사용할 수 있습니다. 메모리가 연속적으로 보장되어 있으므로 배열처럼 사용할 수 있기 때문입니다 . 배열을 평평하게하는 것에 대해서도 생각해야합니다. 루프에서 할당 루틴을 호출하는 것이 정확하지는 않습니다. 할당에는 많은 비용이 듭니다. 행렬 곱셈을 할 때 행 - 메이저/열 - 메이저 쌍의 할당을 고려하면 캐싱에 도움이됩니다 ... 그러나 나는 빗나갑니다.

이것은 일반적인 조언 일뿐입니다. 컨테이너를 사용하여 이것을 다시 구현할 것을 권장하지는 않습니다. 언급 할 필요성을 느꼈습니다.

이 특별한 경우에는 "수학적 알고리즘 실행"을 원한다고 했으므로 매트릭스/벡터 연산을 수행 할 수있는 숫자 라이브러리를 살펴 보시기 바랍니다. 후. C++ 용

가있다 Newmat 예이고, (다소) 표준 BLAS/LAPACK 구현 (즉 Netlib, AMD의 ACML, ATLAS). 이를 통해 최적화/최적화 알고리즘을 사용하여 프로세서가 제공 할 수있는 SIMD 명령어 (예 : SSE)로 벡터 추가/빼기, 행렬 곱하기 등의 일반적인 연산을 훨씬 빠르게 수행 할 수 있습니다.

분명히 계산을 할 때 이러한 값을 반복하지 않아도되지만 최적화 된 방식으로 표준 인터페이스로 처리 할 수는 있습니다.