2012-05-31 3 views
0

GTX550ti 그래픽 카드에서 Nvidia의 OpenCL dev 소프트웨어를 사용하고 있는데 이상한 문제가 발생했습니다. (저는 OpenCL에 대한 신입생입니다).OpenCL 커널 영향의 데드 코드로 인해 Nvidia GTX550ti가 발생하는 이유는 무엇입니까?

내 커널 코드는 다음과 같다 : 사실

__kernel void kernel_name(...) 
{ 
size_t d = get_local_id(0); 
char abc[8]; 
... 
} 

char abc[8]이 쓸모가 (죽은 코드) 내 경우에. 그러나 커널 코드에 char abc[8]이 있으면 결과가 완전히 엉망이되어 커널 실행 시간이 훨씬 길어집니다 (2095712 ns). char abc[8]을 주석 처리하면 결과가 정확 해지고 커널의 실행 시간이 더 짧아집니다 (697856 ns). 커널 컴파일러는 죽은 코드를 지우지 않을 것인가?

위의 내용은 반복 할 수있는 명백한 예입니다. 또한 한 프로그램이 완전히 다른 환경에서 다른 시간에 실행될 때 다른 결과를 얻는 낯선 경우가 발생합니다.

메모리 할당 또는 ..와 관련이 있습니까? 문제를 찾는 방법에 대해 누구나 저에게 조언을 해 줄 수 있습니까? 다음과 같은 방법으로

는 oclDeviceQuery 출력 정보가 ​​나열됩니다 플랫폼 버전 = 오픈 CL 1.1
CUDA 4.2.1,
SDK 개정 = 7027912

내 OS는 윈도우 XP입니다.

오늘은 2012-07-17이며이 문제를 해결했다고 생각합니다.

  1. 커널 소스 파일에 #include를 사용하지 마십시오.

  2. 커널 소스 파일에서 울트라 길이 라인 (예 : 커널 소스 파일의 일부 라인 데이터를 생성하는 프로그램 작성)을 사용하지 마십시오.

답변

1

맞아요. 아무런 효과가 없어야합니다.

실제 코드가 아니기 때문에 커널이 간단한 것이 아니라고 생각됩니다. 아마도 당신은 변수가 실행 시간을 높여주는 느린 메모리에 저장되어야한다는 것을 의미하는 어떤 한계를 넘어 귀하의 지역 주민을 밀고 있습니다.

어딘가에 초기화되지 않은 변수 버그가있는 경우 동작이 변경 될 수 있습니다. 빠른 상점에서 일하는 가치를 얻습니다. 느린 상점에서는 다른 것을 얻습니다.

이 이론을 확인하기 위해 다른 로컬 데이터 구조를 제거하고 동일한 효과가 있는지 확인하려고합니다. 다른 8 바이트 이상은 동일한 효과를 가져야합니다.


... 물론 OpenCL 구현에서 버그를 발견했을 수도 있지만 쉽게 확인할 수 있습니다. 다른 OpenCL 장치 용 커널을 컴파일하면됩니다. CPU. 이것은 다른 컴파일러가 다른 문제를 선택하기 때문에 어쨌든할만한 가치가 있습니다.

그 외에는 표준 디버그 기술로 돌아간 것 같습니다.


은 BTW : 귀하의 질문에 한 지점에서 당신은 배열을 호출 abs[8] 오히려 abc[8]보다. 나는 그것이 오타라고 생각하지만, 그렇지 않다면 abs 이름이 abs() 기능과 충돌하기 때문에 문제가 될 수 있습니다. 그건 바보 같은 컴파일러를 혼동시킬 수 있습니다.

+0

감사합니다. 사실, 내 코드는 Intel과 AMD OpenCL SDK를 사용하여 CPU에서 올바르게 실행됩니다. BTW, 나는 Abc [8]을 사용하지 않고 abs (8)을 사용하지 않는다. 오타가 없습니다. – jxj

+0

당신은 다음과 같이 썼습니다. ""char abs [8] "을 주석 처리하면 결과가 정확 해집니다." 나는 그것을 바로 잡기 위해 그것을 편집했다. –

+0

오, 정말. 미안 해요. 오타입니다. 내 실제 코드에서는 abc [8]입니다. 어쨌든 이것은 매우 이상합니다. – jxj

관련 문제