memcpy 구현을 제공하는 방법
저는 베어 메탈 코드를 작성하려고 합니다.memset- 스타일 루프 포함:
for (int i = 0; i < N; ++i) {
arr[i] = 0;
}
그것은 GCC로 컴파일되고 GCC는 그것을 전화로 바꿀 수 있을 만큼 충분히 똑똑합니다.memset()불행하게도 그것은 베어 메탈이기 때문에 나는 가지고 있지 않습니다.memset()(일반적으로 libc에서) 링크 오류가 발생합니다.
undefined reference to `memset'
이러한 전환을 수행하는 최적화는 다음과 같습니다.
라이브러리에 대한 호출로 코드를 생성할 수 있는 패턴의 루프 배포를 수행합니다.이 플래그는 -O2 이상에서 기본적으로 활성화됩니다.
-fprofile-use그리고.-fauto-profile.
그래서 한 사람의 해결책은 최적화 수준을 낮추는 것이었습니다.별로 만족스럽지 않습니다.
나는 또한 이것을 설명하는 매우 유용한 페이지를 찾았습니다.-ffreestandingGCC가 이를 수행하지 못하도록 하기에는 충분하지 않으며 기본적으로 사용자가 직접 구현할 수 있는 옵션 외에는 없습니다.memcpy,memmove,memset그리고.memcmp저는 그렇게 해서 기쁩니다, 하지만 어떻게요?
내가 그냥 글을 쓴다면,memset컴파일러는 내부의 루프를 감지하여 memset 호출로 변환합니다!실제로 제가 사용하고 있는 CPU 벤더가 제공한 코드에서 다음과 같은 의견을 발견했습니다.
/*
// This is commented out because the assembly code that the compiler generates appears to be
// wrong. The code would recursively call the memset function and eventually overruns the
// stack space.
void * memset(void *dest, int ch, size_t count)
...
그래서 저는 그것이 그들이 마주친 문제라고 생각합니다.
의 C 구현을 제공하려면 어떻게 해야 합니까?memset컴파일러가 자신에 대한 호출에 최적화하지 않고 최적화를 비활성화하지 않고 있습니까?
아하 glibc 코드를 확인해보니inhibit_loop_to_libcall이렇게 해야 할 것처럼 들리는 수식어.정의는 다음과 같습니다.
/* Add the compiler optimization to inhibit loop transformation to library
calls. This is used to avoid recursive calls in memset and memmove
default implementations. */
#ifdef HAVE_CC_INHIBIT_LOOP_TO_LIBCALL
# define inhibit_loop_to_libcall \
__attribute__ ((__optimize__ ("-fno-tree-loop-distribute-patterns")))
#else
# define inhibit_loop_to_libcall
#endif
질문에서 다음과 같이 언급했습니다.
이 변환을 수행하는 최적화는 다음과 같습니다.
이 최적화를 해제하기 위해 필요한 것은 통과입니다.-fno-tree-loop-distribute-patterns편집자에게.이렇게 하면 전체적으로 최적화가 해제됩니다.
언급URL : https://stackoverflow.com/questions/67210527/how-to-provide-an-implementation-of-memcpy
'programing' 카테고리의 다른 글
| 파일이 없는 경우 파일 만들기 (0) | 2023.07.31 |
|---|---|
| 단일 스레드, 비OS, 임베디드 애플리케이션에서 글로벌 변수가 무엇입니까? (0) | 2023.07.31 |
| 아약스 요청에서 X-Requested-With 헤더를 제거할 수 있습니까? (0) | 2023.07.31 |
| Spring JPA로 소프트 삭제 처리 (0) | 2023.07.31 |
| 제온을 위한 gcc 최적화 플래그? (0) | 2023.07.31 |