2009-01-30 5 views
28

CUDA 응용 프로그램은 실패하고 종료되기 전에 5 ~ 15 초 정도의 거친 최대 실행 시간이있는 경향이 있습니다. CUDA 응용 프로그램을 오랫동안 실행하지 않는 것이 이상적이라는 것을 알지만 CUDA를 사용하는 올바른 선택이며 스레드 당 순차 작업의 양 때문에 오래 실행해야합니다.이 시간을 연장 할 수있는 방법이 있습니까? 그걸 피하기 위해?CUDA 앱이 몇 초 후 시간 종료 및 실패합니다. 해결 방법은 무엇입니까?

답변

5

가장 기본적인 해결책은 계산 방식의 일부를 선택하는 것입니다. 제가 작업중인 GPU가 모든 상태 정보를 저장하고 중지 한 다음 시작할 수 있다고 확신합니다. 다시.

업데이트 : Linux의 경우 : X를 종료하면 원하는만큼 CUDA 응용 프로그램을 실행할 수 있습니다. 테슬라는 필요하지 않습니다. (A 9600이 이것을 테스트하는 데 사용되었습니다)

그러나 X를 입력하지 않으면 드라이버가로드되지 않고 작동하지 않습니다.

Linux의 경우 X 표시가 나타나지 않아도 작동하므로 X가 아닌 전체 화면 터미널로 화면을 이동하는 동안에는 X를 종료하지 않아도됩니다.

+0

X를로드하지 않은 경우 스크립트를 사용하여 CUDA 드라이버를로드 할 수 있습니다. 자세한 내용은 시작 설명서 (http://developer.download.nvidia.com/compute/cuda/3_2_prod/docs/Getting_Started_Linux.pdf)를 참조하십시오. – Tom

5

이것은 불가능합니다. 시간 제한은 계산에서 버그가 오랜 시간 동안 GPU를 차지하지 못하도록 방지합니다.

CUDA 작업을 위해 전용 카드를 사용하는 경우 시간 제한이 해제됩니다. 테슬라 카드가 필요하거나 모니터가 연결되지 않은 지포스를 사용할 수 있는지 확실하지 않습니다.

+0

이러한 경우가 무엇인지 판단하는 것이 유용합니다. 모니터가 장착되지 않은 비 테슬라 카드를 사용해보고 알아봐야 할 것입니다. – rck

+2

방금 ​​시도했습니다. 테슬라 카드가 필요하지 않습니다. 리눅스를 사용하면서 실제로 X에 들어가는 것을 괴롭히지 않았고 한계가 해제되었습니다. – rck

+0

다른 답변이 제시하는 것처럼, 실제로 가능합니다 ... 답변을 바꿀 수 있습니까? – einpoklum

10

Windows에서 그래픽 드라이버에는 5 초 이상 실행되는 모든 셰이더 프로그램을 종료하는 워치 독 타이머가 있습니다. Xorg/XFree86 드라이버는이 작업을 수행하지 않으므로 가능한 한 가지 해결 방법은 Linux에서 CUDA 응용 프로그램을 실행하는 것입니다.

AFAIK Windows에서 워치 독 타이머를 비활성화 할 수 없습니다. Windows에서이 문제를 해결할 수있는 유일한 방법은 표시된 화면이없는 두 번째 카드를 사용하는 것입니다. 테슬라 일 필요는 없지만 활성 화면이 없어야합니다.

+2

실제로 Windows에서 WDDM 드라이버가있는 모든 장치에는 디스플레이가 연결되어 있는지 여부에 관계없이 워치 독 타이머 문제가 있습니다. NVIDA Tesla 카드는 디스플레이 어댑터로 OS에 대한 GPU를 식별하지 않는 완전히 다른 유형의 드라이버 (TCC 또는 Tesla Compute Cluster) 드라이버를 사용하여이 문제를 해결합니다. 연결된 디스플레이가없는 두 번째 비디오 카드 (Radeon 또는 GeForce)를 연결하면 OS에서 WDDM 디스플레이 어댑터 장치로 계속 인식되며 워치 독 타이머가 계속 적용됩니다. –

25

저는 CUDA 전문가가 아닙니다. 저는 AFAIK가 대략 비교할 수있는 AMD Stream SDK로 개발해 왔습니다.

당신은 윈도우 워치 독 타이머를 비활성화 할 수 있습니다,하지만 이다 매우 명백해야한다 이유로을하지 않는 것이 좋습니다. 비활성화하려면 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Watchdog\Display\DisableBugCheck을 regedit하고 REG_DWORD를 만들고 1로 설정해야합니다. NVidia 제어판에서 작업해야 할 수도 있습니다. CUDA 문서에서 "VPU Recovery"에 대한 참조를 찾아보십시오.

이상적으로는 커널 작업을 데이터를 여러 번 통과시켜 시간 제한으로 실행되는 작업으로 분해 할 수 있어야합니다.

또는 문제 도메인을 명령별로 출력 픽셀 수가 적어 지도록 나눌 수 있습니다. 즉, 하나의 출력 픽셀을 1,000,000 개 계산하는 대신 gpu에 10 개의 명령을내어 각각 100,000 개를 계산합니다.

시간 조각에 맞춰야하는 기본 단위는 전체 응용 프로그램이 아니라 단일 명령 버퍼의 실행입니다. AMD Stream SDK에서는 CtxFlush() 호출로 명령 대기열을 명시 적으로 플러시함으로써 긴 시퀀스의 작업을 여러 시간 조각으로 나눌 수 있습니다. 아마도 CUDA는 비슷한 것을 가지고 있습니까?

아니요은 모든 시간 슬라이스마다 PCIX 버스를 통해 모든 데이터를 앞뒤로 읽어야합니다. 당신은 gpu 로컬 메모리에 텍스처 등을 남겨 둘 수 있습니다. 당신은 무의미한 루프에 갇혀 있지 않다는 것을 OS에 증명하기 위해 일부 명령 버퍼를 때때로 완료해야합니다.

마지막으로 GPU는 이므로 응용 프로그램이 5 초 또는 10 초 내에 유익한 작업을 수행 할 수없는 경우이를 잘못된 것으로 생각합니다.

[편집 날짜 : 2010 년 3 월 업데이트 :] 위의 레지스트리 키는 유효하지 않습니다. Windows XP 64 비트의 핵심이라고 생각합니다. 여기 http://www.microsoft.com/whdc/device/display/wddm_timeout.mspx 나 : 당신은 여기를 찾을 수 있습니다 Vista 및 Windows 7에 대한 새로운 레지스트리 키가 있습니다 http://msdn.microsoft.com/en-us/library/ee817001.aspx

[2015년 4월 업데이트하는 편집 :]이 오래된 정말지고 있습니다. NVIDIA Nsight 도구가 설치되어 있다고 가정하고 Cuda 프로그래밍을 위해 TDR을 비활성화하는 가장 쉬운 방법은 Nsight 모니터를 열고 "Nsight 모니터 옵션"을 클릭 한 다음 "일반"에서 "WDDM TDR 사용"을 false로 설정하는 것입니다. 이렇게하면 레지스트리 설정이 변경됩니다. 닫고 재부팅하십시오. TDR 레지스트리 설정을 변경하면 다시 부팅 할 때까지 적용되지 않습니다.

+12

저는 SIMD 프로그래머가 아니며 TV에서도 재생할 수 없지만 IMHO라고 말하면 너무 일반적입니다. "마지막으로 GPU는 빠르므로 응용 프로그램이 5 또는 10 개의 유용한 작업을 수행 할 수없는 경우 몇 초, 나는 그것을 뭔가 잘못되었다는 표시로 받아 들일 것이다. " 과학적 응용 프로그램 (CUDA가 자주 사용되는 응용 프로그램)에서는 때로는 계산할 것이 많습니다. –

+0

San Jacinto : 아래의 Tom의 답변을 참조하십시오. 시간 초과는 계산중인 GPU가 디스플레이 GPU 인 경우 합리적입니다. 디스플레이에 사용되지 않는 경우 더 많은 옵션이 있습니다. –

+0

워치 독이 비활성화되어서는 안된다고 말하는 것은 잘못입니다. 워치 독은 완전히 깨졌습니다. 디버거를 한 번 밟을 때 트리거되며 멀티 모니터/디스플레이 포트 구성에서 시스템을 완전히 정지시키는 경향이 있습니다. 이는 누구에게 도움이되지 않습니다. –

3

내가 사용하는 해결책은 다음과 같습니다.

1. 모든 정보를 기기에 전달합니다.
2. 반복 버전의 알고리즘을 실행합니다. 각 반복은 이미 장치에 저장된 메모리에서 커널을 호출합니다.
3. 마지막으로 모든 반복이 끝난 후에 만 ​​호스트에 메모리를 전송하십시오.

이렇게하면 값 비싼 장치를 사용하지 않고 CPU에서 반복을 제어 할 수 있습니다 (중단 옵션 포함) < - > 반복간에 호스트 메모리가 전송됩니다.

3

워치 독 타이머는 디스플레이가 연결된 GPU에만 적용됩니다.

Windows에서 타이머는 WDDM의 일부이므로 일부 레지스트리 키를 사용하여 설정 (시간 초과, 도달 시간 제한 등)을 수정할 수 있습니다 (자세한 내용은 Microsoft article 참조).

+0

안녕하세요. Tom은 이미 (~ 6 일) 워치 독 타이머를 수정했으며 하나의 커널이 40 초 동안 실행되도록 관리했습니다. 필자는 상당히 큰 파일을 실행하려고 시도했지만 "ErrorLaunch TimeOut"오류가 계속 발생합니다. 나는 단 하나의 GPU 밖에 가지고 있지 않기 때문에 GPU가 커널을 끝내기 전에 응답해야하는 다른 것들이 있는지 궁금 해서요. esp는 실행하는데 약 4-5 분이 걸리고 시간 초과는 큰 숫자? 시간 내 주셔서 감사합니다. 정말 고맙습니다. –

2

Linux에서이 동작을 비활성화 할 수 있습니다. "워치 독"이 분명한 목적을 가지고 있지만 셰이더/CUDA를 사용하여 광범위한 계산을 수행 할 때 예상치 못한 결과가 발생할 수 있습니다.

옵션

이 X-구성 (가능성이 /etc/X11/xorg.conf 파일)

추가로 전환 할 수 있습니다 : 당신의 GPU의 장치 섹션에 옵션 "대화"를 "0"으로 작업을 수행합니다.

매개 변수에 대한 설명

ftp://download.nvidia.com/XFree86/Linux-x86/270.41.06/README/xconfigoptions.html#Interactive을 보이는 구성에 내용

CUDA Visual Profiler 'Interactive' X config option? 참조.

8

해결 시간 제한 감지 및 복구 - WINDOWS 7 (32/64 비트) Windows가 더 이상 지연 할 수 있도록

가하는 높은 금액으로 TDR 설정을 변경하려면 Windows의 레지스트리 키를 생성 전에 TDR 프로세스가 시작됩니다.

실행 또는 DOS에서 Regedit를 엽니 다. 올바른 레지스트리 키 영역에 윈도우 7 탐색에

에서, 새 키를 만듭니다 :

HKEY_LOCAL_MACHINE> SYSTEM> CURRENTCONTROLSET> 제어판> GraphicsDrivers.

DWord로 DxgKrnlVersion이라는 키가 하나있을 것입니다.

마우스 오른쪽 버튼으로 클릭하고 새 키 REG_DWORD을 만들 선택하고 이름을 TdrDelay. 그것에 할당 된 값은 TDR이 시작되기까지의 시간 (초)입니다. Windows에서 현재 자동으로 2입니다 (등록 키 값이 존재하지 않는 경우에도 이더라도). TDR 전에 시간을 두 배로하는 새로운 값 (4 초 시도)으로 을 할당하십시오. 그런 다음 PC를 다시 시작하십시오. 값이 이되기 전에 PC를 다시 시작해야합니다.

출처 Win7 TDR (Driver Timeout Detection & Recovery) 나는 또한 이것을 확인했으며 정상적으로 작동합니다.

+0

이것은 나에게 비슷한 문제를 해결했습니다 ... – einpoklum