많은 양의 값 (여전히 64KB보다 작음)이 있다고 가정 해 봅시다. 은 매우이지만 커널에는 쓰이지는 않습니다. 그러나 외부에서 바뀔 수 있습니다. 배열에는 두 개의 값 집합이 있으며 왼쪽과 오른쪽을 호출 할 수 있습니다. 문제는 큰 배열을 __global로 가져 와서 __local 왼쪽 및 __local 오른쪽 배열에 쓰는 것이 더 빠릅니까? 또는 상수 __constant 큰 그것을 얻고 커널에서 accesing 처리 할?OpenCL : __constant 대 __local?
__kernel void f(__global large, __local left, __local right, __global x, __global y) {
for(int i; i < size; i++) {
left[i] = large[i];
right[i] = large[i + offset];
}
...
x = foo * left[idx];
y = bar * right[idx];
}
대 : 예를 들어
__kernel void f(__constant large, __global x, __global y) {
...
x = foo * large[idx];
y = bar * large[idx * offset];
}
(인덱싱은 좀 더 복잡하지만 예를 들어, 매크로를 만들 수 있습니다) 나는 상수 메모리가 글로벌 공간에 살고 있음을 읽을 , 그래서 더 천천히해야합니까? Nvidia 카드에서 실행됩니다.
안녕하세요, 고마워, 나는 당신의 요점을 볼 수 있지만 '왼쪽'과 '오른쪽', 또는 '대형'의 값은 다시 CPU로 복사되지 않습니다. 명확히하기 위해, 변수 x와 y는 계산 대상이고, 대형 배열은 일부 가중치입니다. GPU에'x'와'y'가 두 개뿐 아니라 둘 다 있습니다. 커널은 여러 번 호출되며, 결국'x'와'y' 만 CPU에 다시 읽혀집니다 . –
아, 알겠습니다. 그렇다면 아마 두 가지 옵션이 더 좋을 것입니다. 왜냐하면 전역 메모리에 'large'가있을 필요가 없기 때문입니다. 대부분의 GPU는 상수 메모리 공간을위한 특별한 캐시를 가지고 있습니다. 그래서 그것은 갚을 것이다. 단지 당신은 OpenCL 키워드 앞에 두 개의 밑줄이 필요 없으며 '상수'는 이제 '__constant'와 동일합니다. –
내 경험에 비추어 볼 때 trival 알고리즘이 아닌 대부분의 경우 성능을 예측하기가 매우 어렵습니다. 한 아키텍처에 대한 최적화는 다른 아키텍처에 대한 악몽 일 수 있습니다. 그래서 귀하의 질문에 대답하기 위해 슬리브를 굴리고 양쪽을 구현하고 그것을 테스트해야합니다 :). –