2012-01-23 2 views
2

OpenCL에 버퍼로 복잡한 데이터 형식을 전달해야하며 (가능한 경우) 버퍼 정렬을 피하려고합니다.OpenCL에서 데이터 정렬 피하기

typedef struct 
{ 
    char a; 
    float2 position; 
} s1; 

typedef struct 
{ 
    char a; 
    float2 position; 
    char b; 
} s2; 

내가 이런 식으로 커널을 정의 : 오픈 CL에서

나는 그들에게 버퍼 캐스팅에 전달 된 데이터를 구별하기 위해이 개 구조를 사용할 필요가

__kernel void 
Foo(
    __global const void* bufferData, 
    const int amountElements // in the buffer 
) 
{ 
    // Now I cast to one of the structs depending on an extra value 
    __global s1* x = (__global s1*)bufferData; 

} 

을 그리고 그것은 잘 작동 버퍼에 전달 된 데이터를 정렬 할 때만.

질문 : 사용하는 방법이 있는가 _ 전달 데이터 속성 _ ((효율)) 또는 _ 속성 _ ((배열 1)) 피하기 위해 정렬 버퍼?

답변

1

더 작은 구조체를 패딩하는 것이 옵션이 아닌 경우, 커널 기능에 유형이 무엇인지 알려주는 매개 변수를 전달하는 것이 좋습니다. 아마도 요소의 크기 일 수도 있습니다.

데이터 유형이 9 및 10 바이트이므로 커널에서 읽는 데이터의 개수에 따라 12 바이트로 패딩해볼 가치가 있습니다. 당신이에 관심이있을 수 밖에

뭔가가 확장 : cl_khr_byte_addressable_store http://www.khronos.org/registry/cl/sdk/1.0/docs/man/xhtml/cl_khr_byte_addressable_store.html

업데이트 : 난 당신이 혼합 배열을 전달했다 몰랐 , 내가 뭔가 유형에 균일 생각했다. 요소 단위로 유형을 추적하려면 유형 (또는 코드)의 목록을 전달해야합니다. bufferData에서 자체적으로 float2를 사용하는 것이 더 빠를 수도 있습니다.

__kernel void 
Foo(
    __global const float2* bufferData, 
    __global const char* bufferTypes, 
    const int amountElements // in the buffer 
) 
+0

안녕하세요 @ mfa, 패딩을 사용할 수 없습니까? 버퍼에서 실제로 전달해야하는 것은 두 가지 유형의 노드가있는 트리이므로 작업이 조금 어려울 것입니다. 각 노드에 어떤 유형의 노드인지 나타내는 1 바이트를 전달합니다. – Michelle

+0

정확히 무엇을하려고합니까? 나는 다른 제안으로 위의 업데이트를 만들었습니다. – mfa

+0

GPU 메모리에 트리를 보내려고하지만 OpenCL에서 버퍼 및 프로그램 디자인에 많은주의를 기울여야하므로 패딩을 피하려고합니다.하지만 패딩이 그때 나는 그것을해야만한다. 패딩 작업을 수행하는 알고리즘을 만들려고했습니다. ** float3 **를 전달해야합니다. ** float2 **로 전달하면 OpenCL의 코드가 명확하지 않으므로 패딩을 수행하고 명확한 OpenCL의 코드를 선호합니다. 도움 주셔서 감사합니다. – Michelle

관련 문제