2014-07-13 4 views
2

나는이 코드를 사용하여 선택 요소를 수정할 수 있습니다 알고배열의 선택 요소를 수정

int* idx = ... 
float* x = ... 
float* a = ... 
for (int i=0; i<N; i++){ 
    x[idx[i]] = a[i]; 
} 

더 명확한 예는 해당 파이썬 구문입니다 :

x = zeros(8) 
idx = array([1, 4, 5, 7, 2]) 
x[idx] = arange(5)*20 
// x = [0, 20, 20, 0, 20, 20, 0, 20] 

그러나 나는 사람들이 알고 이런 간단한 for-loops를 최적화하는데 많은 시간을 소비 해왔다. LAPACK, BLASvDSP에 대한 설명서를 살펴 보았지만 선택 요소를 수정하는 기능을 찾지 못했습니다.

나는 본질적으로 내가 원하는 것의 역함 인 x[i] = a[idx[i]]을 발견했다. 어떤 함수가 다른 배열을 기반으로 배열의 select 요소를 수정합니까?

+0

'idx []'이 룩업 테이블입니까? –

+0

최적화가 가능한지 잘 모르겠다.'idx'와'a'의 프리 페치를 시도 할 수는 있지만,이 간단한 경우에 이미 완료되었을 것이다.'idx [i] '시퀀스는 어떤 특별한 속성은 무엇입니까? – Pradhan

+0

@FiddlingBits 아니요, 단지 'int *'입니다. 조회 테이블도 작동 할 수 있습니까? 어떤 기능이 보입니까? – Scott

답변

0

최적화 된 제품과 그렇지 않은 제품은 흑백이 아닙니다. 최악의 경우, 항상 자신을 벡터화 할 수 있습니다. Grand Central Dispatch 당신이 사용하고 싶습니다; 다른 라이브러리에는 OpenMP이 포함됩니다.

Wikipedia example 보면 두 개의 별도의 구축으로, 다음 코드를 실행하고 해당 섹션의 주석,

NSLog(@"Start"); 

//dispatch_async(dispatch_get_main_queue(), ^{ 
    for (int i=0; i<N; i++){ 
     x[j[i]] = b[i]; 
    } 
//}); 

NSLog(@"End"); 

우리는 다음과 같은 결과를 얻을 수

:

dispatch_async: 
2014-07-25 21:12:23.509 swix[15390:303] Start 
2014-07-25 21:12:26.649 swix[15390:303] End 

Serial: 
2014-07-25 21:12:55.719 swix[15428:303] Start 
2014-07-25 21:12:58.860 swix[15428:303] End 

우리는 3.1 초 두 가지를 얻을 수 . 위키 피 디아 예제를 들어 올리면 단순한 오타가 생기지 않는다는 것을 알 수 있습니다. 컴파일러가이 간단한 루프를 극한까지 최적화한다고 추측 할 것입니다. 특히 -Ofastest