2011-07-27 5 views
3

실제 작업을 수행하려는 이유가 많이 있습니다. 우리는 가변 길이 데이터 구조의 목록을 가지고 있기 때문에 모든 요소를 ​​다시 복사하지 않고 요소 중 하나의 크기를 변경할 수 있기를 원합니다.커널 호출에 cl_mem 목록을 전달하는 방법에 대해 어떻게 생각합니까?

여기에 내가 시도한 몇 가지이다 :

  1. 그냥 커널 인자를 많이 가지고있다. 물론, 해커처럼 들리지만 작은 N을 위해 일합니다. 이것은 실제로 우리가해온 것입니다.
  2. Do) 1) 커널 args를 최대 크기 (장치에 따라 다르다고 생각합니다.)로 확장시키는 일종의 매크로 루프가 있습니다. 나는 이것을 정말로하고 싶지 않다. .. 그것은 나쁘게 들린다.
  3. 포인터를 포함하는 일종의 구조체 목록을 만들고 커널 호출 전에 채우십시오. 나는 이것을 시험해 보았는데, 그것이 스펙을 어기는 것이라고 생각한다. nVidia 포럼에서 본 내용에 따르면, 한 번의 커널 호출 이상으로 장치 포인터의 주소를 유지하는 것은 불법입니다. 만약 누군가가 스펙에서 어디서 이것을 가리킬 수 있다면, 나는 그것을 발견 할 수 없기 때문에 이것을 알고 싶다. 그러나 ATI 하드웨어가 오브젝트를 움직이면 확실히 깨질 수 있습니다.
  4. 가변 크기의 객체를 큰 배열에 저장하고 빈 공간을 사용하는 영리한 알고리즘을 작성하여 전체 배열의 리플 로우 횟수를 줄여야합니다. 이것은 효과가 있지만, 우아하고 복잡한 디자인입니다. 또한, 그것은 무서운 포인터 산술을 많이 필요로 ...

다른 사람이 다른 아이디어가 있습니까? 이것을 시도하는 경험은 어떨까요? 거기에 최소한의 해킹 방법이 있습니까? 왜?

답변

0

3 : OpenCL 1.1 사양 페이지 193은 "프로그램에서 커널 함수에 대한 인수를 포인터에 대한 포인터로 선언 할 수 없습니다."라고 말합니다.

포인터 (버퍼 객체에 대한 포인터)에 대한 포인터를 포함하는 구조체는이 문장을 엄격하게 읽지 않아도되지만 정신 상태에 있습니다. 버퍼 객체에 대한 포인터가 호스트 코드의 인수로 커널에 전달되지 않을 수도 있습니다 사용자 정의 구조체 내부에 숨겨져 있습니다.

옵션 5 : 가변 크기 데이터 구조를 사용하지 마십시오. 일정한 크기로 만드는 방법이 있다면 꼭 그렇게하십시오. 그것은 당신의 인생을 훨씬 쉽게 만들 것입니다. 정확하게 말하면 '가변 크기 구조'가 없습니다. 모든 구조체 정의는 상수 크기의 구조체를 생성하므로 크기가 변경된 경우 구조체 자체가 변경되어 다른 mem 객체가 필요합니다. 커널 함수에 전달 된 모든 포인터는 단일 유형이어야합니다. 객체는 가장 큰 가능한 객체의 크기에 노동 조합을 사용할 수있는 비슷한 크기를 가지고있는 경우

: 또한

0

는 응답 옵션 5를 sharpnelis합니다. 그러나 명시 적 정렬을 사용해야합니다. 가변 사이즈 object-in-static-size-union 버퍼 내의 각 오브젝트로 사용되는 공용체를 식별하는 2 번째의 버퍼를 건네줍니다.

임의 유형의 변수 배열 하나만 허용하는 opencl lib 코드를 사용할 때 이것을 되돌 렸습니다. 나는 단순히 cl_float2을 사용하여 두 개의 수레를 통과 시켰습니다. cl_floatN 유형이 공용체로 구현 되었기 때문에 빌드 유형에서 작동하는 것은 사용자에게도 적합합니다.

관련 문제