OpenCL에서는 작업 그룹의 스레드를 동기화하기 위해 barrier()
함수를 사용할 수 있습니다. 나는 (일반적으로) 그들이 무엇을 위해 무엇을 언제 사용하는지 이해한다. 또한 작업 그룹의 모든 스레드가 장벽을 넘어야한다는 사실을 알고 있습니다. 그렇지 않으면 문제가 있습니다. 그러나 지금까지 장벽을 사용하려 할 때마다 내 비디오 드라이버가 손상되거나 잘못된 메모리에 액세스하는 것과 관련된 오류 메시지가 나타나는 것으로 보입니다. 지금까지 2 개의 다른 비디오 카드에서 이것을 보았습니다 (1 ATI, 1 NVIDIA).OpenCL의 장애물
그래서, 내 질문은 :
- 어떤 생각이 왜 이런 일이까요?
barrier(CLK_LOCAL_MEM_FENCE)
과barrier(CLK_GLOBAL_MEM_FENCE)
의 차이점은 무엇입니까? 나는 그 문서를 읽었지 만 그것은 나에게 명확하지 않았다.barrier(CLK_LOCAL_MEM_FENCE)
대barrier(CLK_GLOBAL_MEM_FENCE)
을 사용하는 경우에 대한 일반적인 규칙이 있습니까?- 잘못된 매개 변수 유형으로
barrier()
을 호출하면 오류가 발생할 수 있습니까?
은 분명히 CLK_GLOBAL_MEM_FENCE는 CLK_LOCAL_MEM_FENCE보다 자주 느립니다. 이유는 블록 내의 모든 스레드가 메모리 액세스가 완료 될 때까지 기다려야하기 때문입니다. 그리고 전역 메모리 액세스가 완료되기를 기다리는 것은 로컬 메모리 액세스보다 훨씬 비쌉니다. 물론 이것은 항상 사실이 아닙니다. 액세스 패턴 (Fermi에는 이제 캐시가 있습니다. 이는 공유 메모리와 비슷한 대기 시간을 갖는 L1에서 전역 액세스를 캐시 할 수 있음을 의미합니다), 커널의 글로벌/로컬 메모리 액세스 수 , 점유, 은행 충돌, coalescences 등. – Zk1001