2017-01-06 1 views
0

두 가지 프로그램이 처음부터 작성되었습니다. 하나는 정수이고 두 번째 행렬 - 행렬 곱셈입니다. GPU 카드로 두 프로그램을 실행할 때 전역 크기를 1024로 설정했을 때 커널 코드가 1024 번 실행될 것으로 예상했는데 문제가 없었습니다. 전체 크기를 설정하고 로컬 크기를 변경하는 것과 같은 양의 시간을 실행했습니다. 결과를 코드화하고 출력하는 데 문제가되지 않았습니다. 동일한 코드를 CPU와 함께 실행하려고했는데, 커널 기능이 전역 크기에서 설정된 시간만큼 동일한 시간을 실행하지 않는 것을 보았을 때 충격을 받았습니다. 전역 크기 = 2048, 로컬 크기 = 1, 커널 기능의 2048 실행을 예상하고 있습니다. 그래, 2048, 이지만 글로벌 크기 = 2048이고 로컬 크기 = 16이면 그것은 256 번 실행합니다 ... 정상입니까? opencl에서 GPU와 CPU가 다른 이유는 무엇입니까? 나는 우리가 사용하는 장치가 사용자 측에 문제가되지 않는다고 생각합니다. 동일한 코드가 다른 장치에서 동일하게 작동해야합니다. 나는 틀린 사람들인가?OpenCL GPU와 CPU는 같지만 OpenCl의 알고리즘은 두 장치에서 다르게 작동합니다.

도움을 위해 미리 감사드립니다!

+0

우리는 [최소, 컴파일 가능, 인증 가능한 예제] (http://stackoverflow.com/help/mcve)가 필요합니다. 그래서 몇 가지 코드를 게시하고 그것을 enqueuing하는 방법을 알려주십시오 (그리고 OpenCL 드라이버 등) 일반적으로 드라이버는 전체 그리드가 실행되도록해야합니다. 즉, 로컬 작업 크기와 글로벌 작업 크기 스레드가 전체적으로 실행되는 시간입니다. – einpoklum

+0

전역 스레드 ID와 그룹 ID 및 로컬 스레드 ID의 잘못된 차단이 있어야합니다. 사형 집행 건 수는 어떻게 확인하나요? –

+0

@huseyintugrulbuyukisik 커널 코드에서 전역 변수에 + = 1을 추가하면 커널이 몇 번 실행되었는지 확인할 수 있습니다. – Gzyniu

답변

0

직렬 작업에 원자 단위 작업을 사용합니다 (또는 적어도 쉽게 쉽게 사용할 수 없음). 참여 얼마나 많은 스레드를 계산하려면 a[0]+=1;

atomic_add(&a[0],1); 

작업 또는 중요하지 않습니다 서명 부호없는 정수입니다

atomic_inc(a) 

을 더 나은해야 사용하지 마십시오.

+0

좋습니다, 예, atomic_inc가 작동하지 않습니다. 나는 그것이 일을하고 값을 증가시키는 것을 의미하지만,이 값은 결국 전체 크기와 다릅니다. 나는 그것을 얻지 못한다. 나는 완벽하게 1, 2 혹은 심지어 8 GPU에서 동작하는 코드를 가지고있다. 그러나 CPU로 swiched했을 때 (clgetDeviceIds 인수를 CL_DEVICE_TYPE_CPU로 바꾸는 것을 잊어 버리지 않았다.) 그것은 GPU에서와 다른 이상한 행동을한다. GPU 대신 CPU로 작업 할 때 다른 점이 있습니까? – Gzyniu

+0

다른 결과로 문제가 해결되었지만 여전히 CPU와 GPU가 다르게 작동하는 데 문제가 있습니다. 내가 int 방식으로 int = get_global_id (0)을 가지고 있고 전역 크기를 극단적으로 크게 설정하더라도, 모든 쓰레드는 작은 작업을 할 것이지만, CPU에서 나는 local_size = 4096을 설정하면 그것을 볼 수있다. (최대) 커널에서 0에서 4095까지 번호가 매겨진 스레드가 있습니다 ... 왜?로컬 ID가 아닌 로컬 ID를 가져 오는 중입니다 ... GPU에서는 로컬 크기가 1로 설정되고 1024로 설정되어있을 때 작동합니다. 그런 문제는 없습니다. 왜 그런가요? – Gzyniu

+0

id가 0에서 시작합니다 –

0

문제의 원인을 발견했습니다. 그것은 float의 정밀도가 좋지 않아서 변수를 두 배로 변경하면 잘 동작합니다. 나는 CPU와 GPU를 부동 소수점 연산의 관점에서 읽었으며, 정밀도와 관련하여 약간 다른 방식으로 작업합니다.

관련 문제