2012-04-27 2 views
0

저는 리소스를 거의 사용하지 않아야하며 매우 빨라야하는 응용 프로그램을 개발 중입니다. 그리고 내 애플 리케이션에서 나는 이미지에서 가져온 바이트를 포함하는 unsigned char* rawData을 사용한다. 그래서이 rawData 배열에서 나는 몇 바이트를 유지하고 다른 것은 0으로 설정해야합니다. 그러나 나는 어떤 루프도 사용할 수 없다 (그렇지 않으면 나는 단지 각 바이트를 통과하여 0으로 설정할 수있다).서명되지 않은 char 작업. 루프를 사용하지 않고 요소를 대체하는 방법은 무엇입니까?

여기에 질문이 있습니다.

Q1) C

Q2)의 목표 C ZeroMemory 등의 임의의 방법은 루프를 사용하지 않고 제로 nessecary 바이트를 설정하는 다른 방법들이 존재이다.

미리 감사드립니다 ...

P.S. 몇 가지 코드를 제공 할 수 있습니다 ...

+2

'memset'이 원하는대로 할 수 있습니까? –

+0

답장을 보내 주셔서 감사합니다. 하지만'memset '을 어떻게 사용하는지 알 수는 없었다. 그리고 나는 그것이 내가 원하는 것을하지 않을 것이라고 생각합니다. 'setZero : rawData FromByte : 0 ToByte : someByte' – Garnik

+0

'memset이 도움이 될 것 같아요 ... 이것은 유일한 방법입니다 ... – Garnik

답변

2

버퍼의 크기를 모르는 경우 루프없이 수행 할 수 없습니다. 루프를 직접 작성하지 않더라도 strlen과 같은 함수를 호출하면 루프가 발생합니다. 재귀를 반복문으로 여기고 있습니다.

보존 할 바이트 및 0으로 설정할 바이트를 어떻게 알 수 있습니까? 이러한 바이트가 알려진 위치에 있으면 벡터 연산을 사용하여 바이트 중 일부를 제로화하고 다른 바이트는 제로화 할 수 있습니다. 다음 예 rawData의 처음 64 바이트 위에 만 짝수 바이트를 제로로 :

__m128i zeros = _mm_setzero_si128(); 
uint8_t mask[] = {8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0}; 
__m128i sse_mask = _mm_load_si128(mask); 
_mm_maskmoveu_si128(zeros, sse_mask, &rawData[0]); 
_mm_maskmoveu_si128(zeros, sse_mask, &rawData[16]); 
_mm_maskmoveu_si128(zeros, sse_mask, &rawData[32]); 
_mm_maskmoveu_si128(zeros, sse_mask, &rawData[48]); 

mask 각 바이트의 상위 비트 zeros의 해당 값 rawData에 복사되며, 1 인 경우. 이 마스크 된 복사본의 시퀀스를 사용하여 다른 바이트가 아닌 일부 바이트를 신속하게 바꿀 수 있습니다. 결과 머신 코드는 SSE 연산을 사용하므로 실제로는 매우 빠릅니다. 필수는 아니지만 rawData이 16 바이트 정렬 인 경우 SSE 작업이 훨씬 빠르게 실행됩니다.

ARM을 타겟팅하는 경우 죄송합니다. NEON 내장 함수는 비슷하지만 동일하지는 않습니다.

+0

흠 ... 처음에는 왜, 어쩌면 모르겠지만 그런 식으로해야하지만, 내 rawData'의 크기 (이'unsigned char * rawData = (unsigned char *) calloc (gridSize * gridSize, sizeof (unsigned char));')는 항상 4로 초기화됩니다. 그것이 4byte를 반환한다고 생각합니다. 둘째로, strlen없이 버퍼의 크기 (rawData)를 가질 수 있습니다. 그리고 세 번째 문제는, 미안하지만 당신의 코드를 이해하지 못했습니다. :( – Garnik

관련 문제