2012-11-06 2 views
3

현재 OpenCL에 대해 다소 혼란스러운 검색 알고리즘 (더 큰 이미지 처리 알고리즘의 일부 임)을 마이그레이션 중입니다.OpenCL 커널 내부의 임시 매트릭스 및 개인 메모리 다루기

알고리즘은 처리를 위해 몇 가지 내부 행렬과 벡터를 사용합니다. 그들 중 절반은 크기가 작고 (10 열 미만), 나머지 절반은 입력 행렬 (n * n, 2n * n 등)에 따라 약간 커질 수 있습니다.

모든 내부 행렬의 정의는 입력 행렬에 따라 다릅니다.

표준에 로컬 할당 기능이 없으므로 전역 메모리에서 작업 항목의 개인 메모리로 메모리 덩어리를 매핑하여 메모리 문제에 접근했습니다. 컨텍스트 설정 중에 청크가 겹치지 않아 런타임시 데이터 일관성이 보장됩니다.

이 접근 방식은 나에게 맞는 것 같지 않습니다. 그것은 해킹처럼 느껴집니다.

이런 상황에 처한 사람이 있습니까? 당신의 해결책은 무엇입니까?

+0

좋아요. 거기에 마이그레이션 할 수 있습니까? 아니면 내가 다시 게시해야합니까? –

+0

나는 사회자가 할 수 있다고 생각한다; 나는 그들이주의를 끌 수 있도록 플래그를 지정합니다. –

+0

Paul, 글로벌 메모리에서 개인 메모리로 덩어리를 매핑한다고 할 때 당신이 의미하는 바를 명확히 할 수 있습니까?함수 내부에 배열을 선언하고 커널 인수로 전달 된 전역 포인터에서 데이터를 복사한다는 것을 의미합니까? –

답변

2

일반적으로 호스트로 다시 출력하는 데만 사용되지만 이처럼 전역 메모리 버퍼를 세그먼트 화하면됩니다. 글로벌 메모리 액세스는 일반적으로 명령 사이클의 수백 비용, 그래서 나는 당신에게 제안 :

  1. 대신 __private 또는 __local 메모리에 임시 데이터를 할당합니다. 후자의 경우 CL_DEVICE_LOCAL_MEM_SIZE를 확인하십시오. 일반적으로 16KB-64KB입니다. 다중 프로세서의 __local 메모리는 작업 그룹 전반에서 공유된다는 점에 유의하십시오. CL_DEVICE_LOCAL_MEM_SIZE 제한 내에서 너무 많이 사용하면 다중 프로세서의 점유율에 부정적인 영향을 미치므로 처리량이 저하됩니다. 이를 관찰하는 가장 좋은 방법은 작업량 + 기기를 실험하는 것입니다.

  2. 임시 행렬이 __local 메모리에 비해 너무 큰 경우 각 작업 항목을 더 작게 만들 수 있으므로 적합하고 전역 메모리가 많이 필요하지 않은지 고려하십시오.

  3. 각 작업 항목의 최소 데이터 공간에 약간의 제한이있는 경우 설명대로 __global 메모리를 사용하십시오. 그러나 확인하십시오 당신 : 글로벌 메모리 액세스에 대한 몇 가지 바쁜 대기하는 동안, 다른 사람은 멀티 프로세서에 예약 할 수 있도록 작업 그룹을 듬뿍

    • 시작 커널 ("대기 시간이 숨어").
    • 공급 업체가 지원하는 한 전역 메모리 액세스를 통합합니다. NVidia OpenCL Best Practice 가이드는 세부 사항을 다루며 100 % 이상의 성능 향상을 달성 할 수 있습니다.
+0

답변 해 주셔서 감사합니다. "다중 프로세서의 __local 메모리는 작업 그룹간에 공유됩니다."- __local 메모리는 작업 그룹이 아닌 작업 항목 중 ** ** 공유 된 것으로 생각했습니다. 위의 문장으로 그 의미가 무엇입니까? –

+0

죄송합니다. 필자가 말한 것은 __local 변수는 작업 그룹 내에서만 액세스 할 수 있지만이 작업을 지원하는 실제 메모리는 여러 작업 그룹에 걸쳐 공유된다는 것입니다. 따라서 CL_DEVICE_LOCAL_MEM_SIZE 전체 크기의 커널 __local 인수를 지정하면 한 번에 하나의 작업 그룹 만 다중 프로세서에서 예약 할 수 있습니다. 이것은 일반적으로 전체 처리량을 손상시킵니다. –

+0

예, 지금은 분명합니다. 감사! –

1

접근 방식이 괜찮은 것 같습니다.

NVidias OpenCL best practice guide을 살펴볼 수 있습니다. 3.2.2 절. "공유 메모리"에는 행렬 곱셈의 예제가 있습니다. 각 작업 그룹은 필요한 데이터를 전역 메모리에서 로컬 메모리로 복사합니다.