2017-12-08 24 views
0

쿠다 문서 섹션 1.2.3 Incorrect optimization는 말한다 :부작용이없는 PTX 용 asm volatile을 사용할 이유가 있습니까? 인라인 PTX에

컴파일러는 asm() 문이 출력 피연산자를 변경하는 제외하고 부작용이없는 것으로 간주합니다. asm 삭제하거나 PTX의 생성 중에 이동되지 않도록하려면 volatile 키워드, 예를 사용해야합니다

asm volatile ("mov.u32 %0, %%clock;" : "=r"(x)); 

내 인라인 PTX는 참으로 내가해야한다, 레지스터의 외부에는 부작용이없는 경우 휘발성 물질을 절대 사용하지 마십시오. 규칙을 가정

답변

2

같은 제약 구문을 사용하여 "일반"(비 CUDA) GNU C 인라인 어셈블리와 동일합니다 :


당신이 그것을 명령을 다시 실행하려면을 (들) 소스가 명령문을 실행할 때마다 volatile을 사용하십시오. (아마도 이것은 매번 %clock을 다시 읽으려는 것일 것입니다).

컴파일러가 블록 전후에이 명령문의 두 결과 사이에 루프를 없애거나 그냥 CSE로 만들려면 volatile을 사용하지 마십시오.

GNU C volatile 서술형 asm 문은 입력의 순수한 기능을 처리됩니다. (출력이 없으면 암시 적으로 문이 volatile이됩니다.) 입력이없는 순수한 함수의 경우도 포함됩니다. volatile을 생략하면 매번 동일한 출력이 생성됩니다.

수정하지 않으려는 CPU 제어 레지스터를 읽거나 컴파일러에게 알려주지 않은 메모리 위치에서 값을로드하는 데 적합 할 수 있습니다. 확실히 당신이 시계를 읽으려는 것이 아닙니다.

e.e. 때마다 똑같지 않은 것을 읽는 것은 부작용으로 간주됩니다..