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 });
스택오버플로우는 아님. 어디선가 수정하는 코드 반드시 있음.
ㅇㅇ 쓰고 보니 인자로 넣은게 전부 포인터니 스택오버플로가 일어나도 주소값이 바뀌지 왜 값이 바뀌는가 싶었음;; 다시 찾아보겠음 ㅠ.ㅠ
도움글은 춫