2017-01-10 7 views
0

Intel 플랫폼에서 작동하는 OpenCL C++ 코드가 있습니다. 포인터가 커널 끝의 구조 내에서 받아 들여지지 않는다는 생각이 있습니다. 그러나, 그 안에 자체 참조 포인터 옵션을 사용하는 클래스가 있습니다. 이제 구조를 사용하고 호스트 측의 구조에 대해 동일한 내용을 복제 할 수 있지만 장치 측에서 동일한 작업을 수행 할 수는 없습니다. 예를 들어OpenCL의 자체 참조 포인터

는 다음과 같이

Class Classname{ 
    Classname *SameClass_Selfreferencingpointer; 
    } 
On the Host side I have done the same for the structure as well: 
    struct Structurename{ 
    Structurename *SameStructure_Selfreferencingpointer; 
    } 

누군가는 장치 측이 구현을위한 대체 옵션을 제공 할 수?
사전에 도움을 주셔서 감사합니다.

답변

1

opencl 장치에 malloc이 없으므로 구조체가 구조체 배열로 버퍼에 사용되므로 인덱스를 추가하여 배열에 남아있는 위치를 알 수 있습니다. 커널 이전에 큰 버퍼를 할당 한 다음 원자 함수를 사용하여 가짜 malloc 포인터를 버퍼에서 할당하는 것처럼 증가시키고 마지막으로 "할당 된"구조체 인덱스를 가리키는 정수를 반환합니다. 그런 다음 호스트 측에서 포인터 대신 색인을 사용합니다.

구조체 정렬이 호스트 호스트간에 문제가되는 경우 필드 색인화를 추가 할 수도 있습니다. 필드 B의 시작 바이트 인 필드 A의 시작 바이트는 모두 인덱스를 제외하고 4 개의 사용 된 필드를 갖는 구조체의 단일 4 바이트 정수로 압축됩니다.

  • 호스트가 필드는 3.1415
  • 장치를 찾을 때까지 모든 바이트 오프셋을 구조체에 포인트를 부동 같은 3.1415
  • 장치 검사를 인공 수를 기록합니다 :

    은 아마 당신은 전처리 단계를 추가 할 수 있습니다 찾은 바이트 오프셋을 배열에 놓고 호스트에 보냅니다.

  • 호스트가 바이트 오프셋에서 시작하는 구조체에 float 필드를 씁니다.
  • 호스트와 장치가 정렬됩니다. 호환,
  • 장치가 구조체의 배열에 구조체를 기록 구조체의 필드에 3.14을두고

아마 반대 나은

  • 장치 호스트에서 구조체를 얻을 수있는 모든 커널을 오프셋 같은 사용
  • 호스트는 3.14에 대한 버퍼를
  • 호스트 검사를 얻고 그 바이트 오프셋에서 시작
  • 호스트 쓰고 FP 번호 오프셋 발견 앞으로의 작업

호스트 + 장치쪽에 클래스와 그 복제 된 구조체가 모두 필요합니다.

"sycl api"도 찾아야합니다.

+1

OpenCL KMA는 malloc() 및 free() 기능을 제공합니다. Ben Gaster 블로그와 Roy Spliet github 구현을 참조하십시오. (https://github.com/RSpliet/KMA) –

+1

sycl이 함께 작동하면보다 편한 C++가 가능할 수 있습니까? –

+0

시도해 보려면 ComputeCpp가 SYCL 구현입니다. https://www.codeplay.com/products/computesuite/computecpp에서 다운로드 할 수 있습니다. –