void kernel1(global int* input, global int* coeff, global int *output, global int* N) {

int i = get_global_id(0);

if(i < N[0]) {

output[i] = input[i] * coeff[i];

}

}


이런 커널을 for 문으로 1000번 반복시킬때까진 별 문제 없는데 2000번 정도 넘어가면

갑자기 coeff[i] 값이 변함 ㄷㄷㄷ


coeffi 코드 값을 바꾸는 어떤 변수도 없는데 바뀌고 있는데 ...

지금 상황이 스택 오버플로우 같은거라도 일어나고 있는거라고 봐야되는거임?


// 수정

이거 볼 사람이 있겠냐마는 .. 그래도 혹시나 검색하는 사람을 위해서;


일단 openCL을 C# wrapper인 CLOO를 이용해서 사용하고 있었기 때문에 발생한 문제


cloo에서 메모리를 사용할 때, 다음과 같이 선언했었음..

ComputeBuffer<float> var = new ComputeBuffer<float>(Context, ComputeMemoryFlags.ReadOnly | ComputeMemoryFlags.UseHostPointer, new int[1] { u_init });


메모리 플랙을 UseHostPointer로하면 램에 선언한 바로 그 위치의 값을 복사하지 않고 디바이스가 읽는다고 함 (이게 진짜 가능한건지??)

문제는 저렇게 한번 읽은 뒤엔 u_init은 다시 사실상 다시 쓸 일이 없으니까 가비지 콜렉터님 나오시고 사라지고 나면 건드리지도 않았는데 혼자 발광하기 시작한다고 함.

그래서 저거 대신 CopyHostPointer를 사용하면 훨씬 안전하게 쓸 수 있다고 하고, 플랙 바꾸니까 해결되긴 했음.


다만 디바이스가 호스트의 램에 있는 값을 저렇게 링크해서 책보듯 읽는다는 것도 이상한 일이고

혹시나 해서 루프문 중간에 u_init을 증가시킨 경우에도 디바이스의 var 값이 변하진 않았다는 점 때문에 위의 설명에 의구심이 있긴 함.


ComputeBuffer<float> var = new ComputeBuffer<float>(Context, ComputeMemoryFlags.ReadOnly | ComputeMemoryFlags.CopyHostPointer, new int[1] { u_init });