본문 바로가기
Program Language/OpenCL

OpenCL Address Spaces

by Leo 리오 2012. 6. 2.
반응형


Address Sapce 종류 


__global 

Global memory


Stores data for the entire device and can be read from and writen to 


디바이스내의 모든 커널들이 공유할 수 있다.

매우 느리다.

사용을 최소화 하자.

GPU에선 GPU DRAM에 위치한다.


__constant 

Constant memory 


Similar to global memory, but is read-only


__global메모리와 같다.

다만, 쓰기가 불가능하다.

플랫폼마다 다를 수 있는데, constant메모리 캐시가 있어 global메모리보다는 빠른듯 하다.

읽기만 가능하기 때문에 동기화가 필요없다(불가능 하다.)



__local 

Local memory


Stores data for the work-items in a work-goup


work-goup간에 공유가 가능하다. 다른 work-group끼리는 공유가 불가능 하다.

global 메모리보다 훨씬 빠르다. 

kernel간의 동기화가 필요하다면, 같은 work-group으로 묶고, shared 메모리를 이용해서 동기화 하자.

__kernel void foo_kernel()

{

__local char larr[N];

}

각 work-group마다 N byte씩 할당된다. 총 N*work-group수 만큼 할당된다.

GPU에선 SM의 shared memory에 위치한다.



__private 

Private memory 


Stores data for an individual work-item


기본적인 변수이다.

각각 커널마다 가지고 있다.

다른 커널과는 동기화가 불가능 하다.

GPU에선 register가 담당하고 모자란다면, shared memory로 spill 된다.




Pointer 포인터의 사용(의미) 


__global float *f;

f가 global메모리에 저장되있다는 뜻이 아니라,

f가 global 메모리의 주소를 가르킨다는 뜻이다.


__global float *f;

__global uint *x = 5;

f = (global float*) x; 

는 가능하다.


__global float *f;

__local uint *l = 5;

f = (global float*) l; 

는 불가능하다.

f와 l이 의 address space가 다르기 때문이다.



그럼 포인터를 __private로 사용하려면??

__global uint *x = 5;

__private int offset = 3;

*(x + offset) = 100;

이런식으로 해야 할 듯하다.


Addtion. 이 부분은 다시 생각해봐야할듯, x라는 값자체는 __private로 가지고 있을지도..




전역변수(global variable)무조건 __constant로만 선언해야 한다.

다시 말하면 '전역 변수'는 사용 불가.

(흠, 포인터 전역변수는 __constant Address Space만 가르 킬 수있다.라고 생각 했지만 안된다.)

다른 Address Space도 컴파일러가 충분히 지원해 줄 수 있을꺼 같은데 현재로썬 안된다.


__constant int c; 만 가능.


__constant int* ptr;

__global int g;

__local int l;

__private int p;

void f(){ c++; }

다다다다다 불가능.


전역변수는 미리 정의된 상수를 제외하면 사용할 수 없다고 보면된다.



__global 메모리


__kernel void foo_kerenl()

{

__global char g_arr[10];

}

error: automatic variable qualified with an address space

라는 에러가 뜬다.

global메모리는 kernel에서 선언이 불가능하다. 

아마 커널마다 따로 실행이 되서 인듯하다.


clCreateBuffer를 통해 생성된 메모리 포인터를 받음으로써 

global메모리를 사용가능하다.

__local 메모리나 __private 메모리를 사용하자.









반응형

'Program Language > OpenCL' 카테고리의 다른 글

amd opencl __constant  (0) 2012.06.20
standard functions in OpenCL  (0) 2012.06.04
clBuildProgram  (1) 2012.06.02
clFinish, clFlush, block  (0) 2012.05.26
clEnqueueCopyBufferRect vs clEnqueueWriteBufferRect  (0) 2012.05.22

댓글