우리는 매우 비효율적 인 프로그램이 주어지고 더 빨리 실행되도록 코드를 최적화해야하는 과제가 있습니다. 저는이 두 가지를 제외하고는 대부분 빠르게 움직이고 있습니다. 그 버그는 아주 단순하기 때문에 버그입니다. 하나는 기본적으로 2 차원 배열의 모든 값을 동일한 값으로 설정하고 기본적으로 2 차원 배열의 값을 서로 바꿉니다. 그리고 그것이 문제입니다. 그들은 대부분의 시간을 차지하지만 너무 단순하기 때문에 함수를 깨지 않고 줄이는 방법을 알아낼 수 없습니다. 그리고 다른 학생들이 우스운 속도 향상을 얻고 있기 때문에 빠르게 실행할 수 있음을 알고 있습니다. 문제의 두 부분은 다음과 같습니다.중첩 루프 최적화
fSetArray(int rows, int cols, float val)
{
int i, j;
F2D *out;
out = fMallocHandle(rows, cols);
for(i=0; i<rows; i++)
for(j=0; j<cols; j++)
subsref(out,i,j) = val;
return out;
}
중요한 부분은 두 개의 루프뿐입니다. 기본적으로, 우리는 특정 폭 (행)과 특정 높이 (cols)를 갖는 2-D 배열을 가지며 모든 값을 val로 설정합니다. 그러나 루프 중 하나를 제거 할 수있는 방법은 없습니다 (속도를 높이는 가장 좋은 방법). 내가 명백한 것을 놓치지 않는 한. cols와 rows가 같은 수인 경우, 이것은 훨씬 더 쉬울 것입니다.
fDeepCopy(F2D* in)
{
int i, j;
F2D* out;
int rows, cols;
rows = in->height;
cols = in->width;
out = fMallocHandle(rows, cols);
for(i=0; i<rows; i++)
for(j=0; j<cols; j++)
subsref(out,i,j) = subsref(in,i,j);
return out;
}
아웃 된 배열이 배열에서 항상보다 큰, 그래서 우리는 오버 플로우 또는에 대해 걱정할 필요가 없습니다 :
다른 기능입니다. 이 함수는 기본적으로 두 배열의 값을 바꾼다. 그러나 다시 한번, 너무 단순하기 때문에 더 이상 줄일 수는 없다.
샘플 크기와 서버로 인해 병렬 처리가 수행되기 전에 실제로 스레드를 작성하는 데 필요한 오버 헤드로 인해 프로그램의 속도가 느려집니다. 난 노력 했어. 이 두 함수는 너무 짧기 때문에 스레드를 하나만 만들어서 죽일 필요가 없습니다.
참고로, 이것은 기술적으로 OpenMP 프로젝트이며 우리는 병렬화를 사용해야하지만,이 두 가지 기능을 사용하면 실제로 전체 프로그램의 속도가 느려집니다. 나는 체크하기 위해 병렬 for 루프로 시간을 잰다.
편집 : 저에게 아이디어를 주신 모든 분들께 감사드립니다! 나는 그것을 지금까지 최고 속도로 달리고있다.
루프 순서를 바꿔보십시오. 캐시 적중률에 영향을 줄 수 있습니다. – dasblinkenlight
'subsref'는 어떻게 정의되어 있습니까? 가장 가능성있는 매크로이지만, 함수 인 경우 인라인되고 있는지 확인하십시오. 또는 매크로로 다시 작성하십시오. –
특히 F2D 구조 및 하위 참조 기능에 대한 자세한 내용을 포함해야합니다. – betabandido