2014-02-28 5 views
0

다음과 같이 SIZE 크기의 int16_t 배열을 할당했습니다.연속 메모리 할당 값 증가

#define SIZE 1152 

int16_t *samples = malloc(sizeof(int16_t) * SIZE); 

이제 이러한 값을 다음과 같이 0으로 설정할 수 있습니다.

memset(samples, 0, sizeof(int16_t) * SIZE); 

(memset 유사) 및 하지 어레이의 모든 단일 소자를을 반복하여 하나의 동작으로 일정량 samples 저장/감소 값을 증가시키는 방법이 있는가?

중요한 경우 Android 용 C 코드 처리 오디오입니다.

업데이트 : ARM 용으로 NEON instruction을 사용하려고합니다. 이들은 병렬로 데이터 벡터에서 연산을 실행할 수있게합니다.

+2

루프를 작성하십시오. 호출 된 함수 "memadd"에 랩핑하십시오. 완료 ... – keshlam

+0

@keshlam 이것은 오디오 프로세싱입니다. 매우 느린 루핑 ... –

+0

표준 프로세서 지침으로 일부 데이터를 "일괄 증가"할 수 있다고 생각하지 않습니다. 그리고 안드로이드 장치는 이것을 위해 적합한 것을 갖지는 않을 것입니다. (PC 그래픽 카드는 분명히 그것을 지원할 장치의 좋은 예일 것입니다.) – deviantfan

답변

1

하나의 명령으로 수행 할 방법이 없습니다. 그런 어셈블러 명령어가 없으므로 루프해야합니다. 순수한 asm에서 루프를 작성하면 정말 작고 빠를 수 있습니다. 그러나 괜찮은 컴파일러는 일반적으로 잘 작동하는 최적화 스위치가 있어야합니다.

1

Memset 역시 루프입니다. 여기에는 마법이 없습니다.

잘 작성된 C는 손으로 작성한 어셈블러보다 훨씬 느리지 않도록 컴파일하고 최적화해야합니다.

int i=length_of_array; 
while(--i>=0) 
    samples[i]+=offset; 
+0

그런 작업을위한 특수 프로세서의 지침이있을 수 있는지 궁금한가요? –

+0

있을 수 있습니까? 확실한. 거기 있어요? 드물지만, 그래픽 엔진과 같은 벡터 프로세서에 대해 말하지 않는 한, 상수를 벡터에 추가하는 것은 그것들에 대한 공통 연산이다. 한편 현대의 스칼라 프로세서에서는 가져 오기/추가/쓰기주기가 사용자가 알고 있거나 목적을 위해 특수 명령을 사용해야하는 필요없이 하드웨어에서 이미 중첩되어있을 가능성이 있습니다. – keshlam

+0

Android에서 사용할 수있는 ARM 용 Neon 명령어 확장이 발견되었습니다. 그것을 시도하기 위하여 가고있다. http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dht0002a/ch01s04s02.html –