2014-09-17 19 views
1

코드의 일부에서만 벡터화를 활성화하는 방법이 있습니까 (예 : pragma 지시문)? 기본적으로 -ftree-vectorize가 코드의 일부를 컴파일하는 동안 만 활성화되는 것처럼 보입니까? 예를 들어 Pragma simd은 gcc에서 사용할 수 없습니다 ...코드의 한 부분에서만 벡터화를 활성화 할 수 있습니까?

그 이유는 벤치마킹에서 -O3 (벡터화가 가능함)을 사용하면 -O2를 사용하는 경우보다 타이밍이 더 나빴습니다. 그러나 컴파일러에서 루프를 벡터화하려고 시도하는 코드의 일부가 있습니다.

내가 사용할 수있는 한 가지 해결책은 컴파일러 지시문을 하나의 파일로 제한하는 것입니다.

+0

일반적으로 벡터화는 ** 적용 속도가 빨라야 **합니다 **. 그거 확실하니? 코드가 느려지는 것을 어떻게 알았습니까? – edmz

+0

@black 우리는 커다란 프로젝트에 대해 말하고 있습니다. -O3은 어떤 경우에는 느린 코드를 생성 할 수있는 약간의 오버 헤드를 발생시킵니다. http://stackoverflow.com/a/19985801/2436175. 우리의 타이밍 벤치마킹의 경우였습니다. 전 세계적으로 트리 벡터 라이 제이션을 켜는 것은 동일한 위험을 감수해야합니다. 필자는 코드의 어느 부분이 벡터 라이 제이션을 위해 컴파일러에게 요청할 가치가 있는지를 잘 추측 할 수있는 상황에 처해 있습니다. – Antonio

답변

3

예, 가능합니다. 전체 모듈 또는 individual 기능에 대해 비활성화 할 수 있습니다. You can't however do this for particular loops.

개별 기능을 사용하려면 __attribute__((optimize("no-tree-vectorize")))을 사용하십시오.

전체 모듈의 경우 -O3-ftree-vectorize이 자동으로 활성화됩니다. 일단 사용하도록 설정 한 후에는 비활성화하는 방법을 모르겠지만 대신 -O2을 사용할 수 있습니다. 당신이 -ftree-vectorize 제외 -O3을 모두 사용하고자하는 경우 다음이

gcc -c -Q -O3 --help=optimizers > /tmp/O3-opts 
gcc -c -Q -O2 --help=optimizers > /tmp/O2-opts 
diff /tmp/O2-opts /tmp/O3-opts | grep enabled 

그리고이 -ftree-vectorize을 제외한 모든 옵션을 포함 할.

편집 : 설명서 페이지에 -fno-tree-vectorize이 표시되지 않지만 어쨌든 작동하므로 -O3 -fno-tree-vectorize을 사용할 수 있습니다.

편집 : OP는 특정 기능 또는 전체 모듈에 대해 실제로 벡터화를 사용하려고합니다. 이 경우 개별 기능을 위해 __attribute__((optimize("tree-vectorize")))을 사용할 수 있으며 전체 모듈의 경우 -O2 -ftree-vectorize. (안토니오)

편집 :은 이론적으로

#pragma GCC optimize("tree-vectorize") 

을 따라 나무 벡터화 모든 기능을 가능하게하는 프라 그마 지침이 그러나 어쩌면 때문에의 내 g ++ 컴파일러와 함께 작동하지 않을 것 여기에 언급 된 버그 : How to enable optimization in G++ with #pragma. 반면에 함수 특성은 작동합니다.

+0

감사합니다. 나는 지금 "속성"에 대해 정확히 읽었습니다. BTW, 저는 자신을 아주 명확하게 설명하지 않았습니다. 우리는 -O2를 사용하고 로컬 (일부 파일 또는 일부 기능)에서 벡터화를 활성화하려고합니다. – Antonio

+0

@Antonio, 사실 당신은 분명했습니다. 그것은 내 잘못입니다, 나는 당신의 질문을 잘못 읽었습니다. 난 당신이 전체 모듈에 대해'__attribute __ ((tree-vectorize "))'또는'-O2 -ftree-vectorize'를 사용할 수 있다고 생각합니다. –

+0

@Antonio, 나는 모든 기능을 벡터 라이 제이션 할 수 있도록 귀하의 요청에 약간 혼란스러워합니다. 당신은'#pragma GCC optimize ("tree-vectorize")가 작동하지 않지만'-ftree-vectorize'는 무엇이 문제라고 말합니다. 니가 원하는대로해야하지 않아? –