2017-02-23 3 views
0

나는 다음과 같은 매개 변수를 받아들이는 커널이 있습니다OpenCl 커널에서 인덱스를 오프셋하는 방법은 무엇입니까?

1) 글로벌 ID는 지역 ID 16 다음

내가 사용하고있는 커널 아니다하지만 나는 그것을 사용하고 있습니다)

이 1040입니다 내가 구현하고 싶은 것을 보여줍니다. 기본적으로 A와 B의 배열 입력은 1040 * 10입니다. 일정한 반면

__kernel void vector_add(__global const int *A, __global const int *B, __global int *C, int Offset, int constant) { 

    // Index of the current element to be processed 
    int i = get_global_id(0); 


    // Do the operation 
    C[i + Offset*constant] = A[i + Offset*constant] + B[i + Offset*constant]; 
} 

내가 값 0,1, ..., 9를 함유하는 종류의 "어레이"으로 오프셋 싶다 상수이다. 나는 이미 배열로 이러한 값을 전달하려하지만이 방법으로 상쇄하기 위해 배열을 사용할 수 없다고 생각합니다 (프로그램이 충돌 함). 내가 쓰고 싶은 것이의 샘플은 다음과 같습니다 :

__kernel void vector_add(__global const int *A, __global const int *B, __global int *C, __constant const int *Offset, int constant) { 

    // Index of the current element to be processed 
    int i = get_global_id(0); 

    for (int k = 0; k < 10; k++) { 
    // Do the operation 
    C[i + Offset[k]*constant] = A[i + Offset[k]*constant] + B[i + Offset[k]*constant]; 
    } 
} 

는 참고 : 내 커널에 고정 된 상태를 유지해야하므로 글로벌 ID를 확장하는 것은, 옵션이 아니다. 그러므로 : 이것을 달성하기 위해 어쨌든 있습니까?

편집 : 구현하고 싶은 예제를 추가했습니다. 현재로서는 이렇게 작동하지 않습니다. 이게 합법적인가? 내가 가진

+0

배열 요소가 0 인 경우 충돌하지 않아야합니다. 그렇지 않으면 충돌이 발생하지 않고 버퍼의 범위를 벗어납니다. –

+0

@huseyintugrulbuyukisik 제 질문을 편집했습니다. 아마도 더 명확합니다. 내가 게시 한 두 번째 커널은 ...이게 합법적이라면 내 호스트 코드에 문제가 있습니다 – user1816546

답변

1

오류 메시지가 constant가 예약어이기 때문에

매개 변수 명명 된 주소 공간

에 할당 할 수 없다.

가 I이 같이 그것의 끝에서 '1'을 가산함으로써 변수 이름을 변경하려고 :

__kernel void vector_add(__global int *A,  __global int *B, __global int *C, 
         __constant int *Offset,__constant int * constant1) { 

    int i = get_global_id(0); 
    int constVar=constant1[0]; 
    for (int k = 0; k < 10; k++) { 
     C[i + Offset[k]*constVar] = A[i + Offset[k]*constVar] + B[i + Offset[k]*constVar]; 
    } 
} 

을하고 글로벌 = 1040 일 = 1,040 * 10 ABC_size은 로컬은 = 16, 오프셋 0 ~ 9 배열 및 상수 1 = 1040

+0

확인해 주셔서 고마워요.하지만 내 커널에서 작동하도록 할 수는 없어요. 내 호스트 코드 – user1816546

+0

가 다시 충돌합니까? –