많은 SIMD 내장 코드가있는 코드베이스에서 작업하고 있습니다. 이제 AVX2가 생겼으므로 비 AVX 가능 프로세서에서 실행되는 SIMD 코드가 있어야합니다.이 코드는 훨씬 더 많은 작업이 필요합니다. 게다가 AVX2 셔플에 대한 128 비트 레인 교차 제한은 상황을 복잡하게 만듭니다. 이러한 이유로 자동 벡터 라이 제이션에 더 많이 의존해야 할 때입니다. 나를 놀라게하는 주요 사항은 병렬성을 없애고 자동 벡터화 된 코드를 디버깅 할 수있는 가능성에 대한 문제입니다.자동 벡터화 된 루프를 디버깅 할 수 있습니까?
나는 g ++ -O1 -g -ftree - 벡터 라이와 다음 컴파일 및 GDB와 단계별 시도했습니다 (-ftree-벡터화 -O0 작동하지 않는 이유를 아는 사람입니까?)
float a[1000], b[1000], c[1000];
int main(int argc, char **argv)
{
for (int i = 0; i < argc; ++i)
c[i] = a[i] + b[i];
return 0;
}
하지만 의미있는 결과는 얻지 못합니다. 예를 들어, 때로는 i 값이 <이라고 말하면서 >을 최적화하고 다른 시간은 20으로 점프합니다.
디버깅을 위해 SIMD 상태를 원래의 C 상태로 매핑하는 것이 어렵다는 것이 주요 문제인 것 같습니다. 하지만 현실적으로 할 수 있습니까?
왜 디버깅 하시겠습니까? 벡터화되었는지 확인하려면 어셈블리 코드를 검사하거나 벤치 마크를 실행하는 것이 더 낫지 않습니까 (전체 최적화 설정에서)? 버그를 찾으려면 비 벡터 라이 제이션 (및 최적화되지 않은) 버전을 디버깅하십시오. – delnan
예, 컴파일러 버그가 발생하는 경우와 때 그들은 심술 궂은 경우. 나는 (소스 레벨) 디버거가 올바른 접근 방법인지는 모르지만 어쨌든 이해한다. – delnan
오류에 대한 디버깅은 대부분 가설입니다.Visual C++ 2010 벡터 라이저에서 정렬되지 않은로드를 산술 명령어로 부적절하게 단일 x86 명령어로 통합하여 정렬되지 않은 배열에서 실행할 때 충돌이 발생하는 버그를 제출 한 것을 기억합니다. –