2012-06-15 3 views
0

저는 OpenCL을 처음 사용하는데 문제가 있습니다. 내 프로그램에서 2 차원 배열이 필요합니다. 그래픽 카드에 1 차원 배열을 복사했습니다. 1 차원 배열이 필요 없기 때문에 shoudl이 모든 needes 값을 초기화하는 메서드를 작성했습니다. 2 차원 배열은 __global이어야합니다 ---이 배열에 대한 읽기 작업 만 있습니다. 여기OpenCL 전역 배열

내 코드입니다

typedef struct{ 
    unsigned char r; 
    unsigned char g; 
    unsigned char b; 
    unsigned char a; 
} ColorRGBA; 

__constant ColorRGBA array[4096]; 

__kernel void marchingCubes(__global unsigned char* output) 
{ 
    // DO SOMETHING WITH array 

} 


__kernel void initValues(__global unsigned char* input){ 
    // FILL array MAKE 1-dimensional to 2-dimensional (4096,4) 
    array = (ColorRGBA*) input; 
} 

의 OpenCL 프로그램을 컴파일, 나는 다음과 같은 오류 얻을 :

:28:8: error: array type 'ColorRGBA __attribute__((address_space(2))) [4096]' is not assignable 
     array = (ColorRGBA*) input; 

가 어떻게 모든 스레드에서 고쳐 배열에 액세스 할 수 있습니까?

감사 Glethien

답변

0

나는 당신이 가지고있는 캐스트에 대해 잘 모르겠지만, 당신은 전체 배열에 대한 포인터를 할당 할 수 없습니다. 이렇게해야합니다 :

for (int x = 0; x < size_of_input; ++x) 
    { 
    array[x].r = input[x]; 
    array[x].g = input[x]; 
    array[x].b = input[x]; 
    array[x].a = input[x]; 
    } 

함수의 입력 배열 크기를 전달해야합니다.

여기서는 입력 픽셀이 전체 배열의 순서대로 있다고 가정합니다. RGBARGBARGBA 등

+0

입력 길이가 배열입니다 : 16384 서명되지 않은 문자. 이것을 이것을 모양 배열 (4096,4)로 변환하여 전역 배열에 저장하고 싶습니다. 내가 길을 사용한다면 모양이 (0, x, y) 인 배열을 만들지 않겠습니까? – glethien

+0

@glethien 나는 내 대답에 약간의 수정을했고, 그것이 당신이 찾고있는 것이라면 알려주겠습니까? –

+0

실제로 .... 파이썬에서는 이렇게하면됩니다. self.grid = numpy.load ("./ testData.npy") self.grid = self.grid.reshape ((4096,4)) 원래 입력에서 4의 각 블록은 하나의 ColorRGBA – glethien

0

데이터를 명시 적으로 기록하지 않아도됩니다. 단지 1D 버퍼로 처리해야합니다. row_width을 커널 인수로 전달한 다음 index = y * row_width + x으로 적절한 인덱스를 계산할 수 있습니다.

+0

나는 그것을 더러운 방법으로 해결했다. 그러나 그것은 나를 위해 작용할 것이다. StackOverflow를 처음 접했을 때 내 질문에 대한 답변을 게시 할 수 없습니다 ... – glethien

+0

자발적으로 대답 할 수있게되면 계속 참여하고이 질문에 다시 답하십시오. 다행히 해결책을 찾았습니다. – James