Programming/openCL & CUDA2011. 1. 18. 22:20
별건없고, 멀티프로세서와 core의 출력방식이 변경되었다.

CUDA SDK 3.1

D:\CUDA\NVIDIA GPU Computing SDK\C\bin\win32\Release\deviceQuery.exe Starting...


 CUDA Device Query (Runtime API) version (CUDART static linking)

There are 2 devices supporting CUDA

Device 0: "GeForce 8800 GT"
  CUDA Driver Version:                           3.20
  CUDA Runtime Version:                          3.10
  CUDA Capability Major revision number:         1
  CUDA Capability Minor revision number:         1
  Total amount of global memory:                 536543232 bytes
  Number of multiprocessors:                     14
  Number of cores:                               112
  Total amount of constant memory:               65536 bytes
  Total amount of shared memory per block:       16384 bytes
  Total number of registers available per block: 8192
  Warp size:                                     32
  Maximum number of threads per block:           512
  Maximum sizes of each dimension of a block:    512 x 512 x 64
  Maximum sizes of each dimension of a grid:     65535 x 65535 x 1
  Maximum memory pitch:                          2147483647 bytes
  Texture alignment:                             256 bytes
  Clock rate:                                    1.50 GHz
  Concurrent copy and execution:                 Yes
  Run time limit on kernels:                     Yes
  Integrated:                                    No
  Support host page-locked memory mapping:       Yes
  Compute mode:                                  Default
                             (multiple host threads can use this device simultaneously)
  Concurrent kernel execution:                   No
  Device has ECC support enabled:                No

deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 3.20, CUDA Runtime Vers
ion = 3.10, NumDevs = 2, Device = GeForce 8800 GT, Device = GeForce 8800 GT


PASSED

Press <Enter> to Quit...
-----------------------------------------------------------




CUDA SDK 3.2
D:\CUDA\NVIDIA GPU Computing SDK 3.2\C\bin\win32\Release\deviceQuery.exe Starting...

 CUDA Device Query (Runtime API) version (CUDART static linking)

There are 2 devices supporting CUDA

Device 0: "GeForce 8800 GT"
  CUDA Driver Version:                           3.20
  CUDA Runtime Version:                          3.20
  CUDA Capability Major/Minor version number:    1.1
  Total amount of global memory:                 536543232 bytes
  Multiprocessors x Cores/MP = Cores:            14 (MP) x 8 (Cores/MP) = 112 (Cores)
  Total amount of constant memory:               65536 bytes
  Total amount of shared memory per block:       16384 bytes
  Total number of registers available per block: 8192
  Warp size:                                     32
  Maximum number of threads per block:           512
  Maximum sizes of each dimension of a block:    512 x 512 x 64
  Maximum sizes of each dimension of a grid:     65535 x 65535 x 1
  Maximum memory pitch:                          2147483647 bytes
  Texture alignment:                             256 bytes
  Clock rate:                                    1.50 GHz
  Concurrent copy and execution:                 Yes
  Run time limit on kernels:                     Yes
  Integrated:                                    No
  Support host page-locked memory mapping:       Yes
  Compute mode:                                  Default
                             (multiple host threads can use this device simultaneously)
  Concurrent kernel execution:                   No
  Device has ECC support enabled:                No
  Device is using TCC driver mode:               No

deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 3.20, CUDA Runtime Vers
ion = 3.20, NumDevs = 2, Device = GeForce 8800 GT, Device = GeForce 8800 GT


PASSED

Press <Enter> to Quit...
-----------------------------------------------------------

Posted by 구차니
Programming/openCL & CUDA2011. 1. 18. 22:12
warp 크기는 32 라는데,
그 이하로도 묶어서 사용이 가능한지 테스트를 해보았다.

VectorAdd를 변형해서 int 형으로 계산하고, 변수는 총 64개의 int형 배열로 선언
그리고 커널코드는 단순하게 두개의 배열을 더해서 세번째로 던져주게 해놓았다.

단, 커널은 1 block / 5 thread로 설정했다.
// Device code
__global__ void VecAdd(const int* A, const int* B, int* C, int N)
{
int i = threadIdx.x;
C[i] = A[i] + B[i];
}

VecAdd<<<1,5>>>(d_A, d_B, d_C, N);

결과는 아래와 같이 5개만 계산이 되어 나온다.
Vector addition
[000] h_A[0] + h_B[0] = 0, h_C[0]
[001] h_A[1] + h_B[1] = 2, h_C[2]
[002] h_A[2] + h_B[2] = 4, h_C[4]
[003] h_A[3] + h_B[3] = 6, h_C[6]
[004] h_A[4] + h_B[4] = 8, h_C[8]
[005] h_A[5] + h_B[5] = 10, h_C[133]- not ok
[006] h_A[6] + h_B[6] = 12, h_C[134]- not ok
[007] h_A[7] + h_B[7] = 14, h_C[135]- not ok
[008] h_A[8] + h_B[8] = 16, h_C[136]- not ok
[009] h_A[9] + h_B[9] = 18, h_C[137]- not ok
[010] h_A[10] + h_B[10] = 20, h_C[138]- not ok
[011] h_A[11] + h_B[11] = 22, h_C[139]- not ok
[012] h_A[12] + h_B[12] = 24, h_C[140]- not ok
[013] h_A[13] + h_B[13] = 26, h_C[141]- not ok
[014] h_A[14] + h_B[14] = 28, h_C[142]- not ok
[015] h_A[15] + h_B[15] = 30, h_C[143]- not ok
[016] h_A[16] + h_B[16] = 32, h_C[144]- not ok
[017] h_A[17] + h_B[17] = 34, h_C[145]- not ok
[018] h_A[18] + h_B[18] = 36, h_C[146]- not ok
[019] h_A[19] + h_B[19] = 38, h_C[147]- not ok
[020] h_A[20] + h_B[20] = 40, h_C[148]- not ok
[021] h_A[21] + h_B[21] = 42, h_C[149]- not ok
[022] h_A[22] + h_B[22] = 44, h_C[150]- not ok
[023] h_A[23] + h_B[23] = 46, h_C[151]- not ok
[024] h_A[24] + h_B[24] = 48, h_C[152]- not ok
[025] h_A[25] + h_B[25] = 50, h_C[153]- not ok
[026] h_A[26] + h_B[26] = 52, h_C[154]- not ok
[027] h_A[27] + h_B[27] = 54, h_C[155]- not ok
[028] h_A[28] + h_B[28] = 56, h_C[156]- not ok
[029] h_A[29] + h_B[29] = 58, h_C[157]- not ok
[030] h_A[30] + h_B[30] = 60, h_C[158]- not ok
[031] h_A[31] + h_B[31] = 62, h_C[159]- not ok
[032] h_A[32] + h_B[32] = 64, h_C[160]- not ok
[033] h_A[33] + h_B[33] = 66, h_C[161]- not ok
[034] h_A[34] + h_B[34] = 68, h_C[162]- not ok
[035] h_A[35] + h_B[35] = 70, h_C[163]- not ok
[036] h_A[36] + h_B[36] = 72, h_C[164]- not ok
[037] h_A[37] + h_B[37] = 74, h_C[165]- not ok
[038] h_A[38] + h_B[38] = 76, h_C[166]- not ok
[039] h_A[39] + h_B[39] = 78, h_C[167]- not ok
[040] h_A[40] + h_B[40] = 80, h_C[168]- not ok
[041] h_A[41] + h_B[41] = 82, h_C[169]- not ok
[042] h_A[42] + h_B[42] = 84, h_C[170]- not ok
[043] h_A[43] + h_B[43] = 86, h_C[171]- not ok
[044] h_A[44] + h_B[44] = 88, h_C[172]- not ok
[045] h_A[45] + h_B[45] = 90, h_C[173]- not ok
[046] h_A[46] + h_B[46] = 92, h_C[174]- not ok
[047] h_A[47] + h_B[47] = 94, h_C[175]- not ok
[048] h_A[48] + h_B[48] = 96, h_C[176]- not ok
[049] h_A[49] + h_B[49] = 98, h_C[177]- not ok
[050] h_A[50] + h_B[50] = 100, h_C[178]- not ok
[051] h_A[51] + h_B[51] = 102, h_C[179]- not ok
[052] h_A[52] + h_B[52] = 104, h_C[180]- not ok
[053] h_A[53] + h_B[53] = 106, h_C[181]- not ok
[054] h_A[54] + h_B[54] = 108, h_C[182]- not ok
[055] h_A[55] + h_B[55] = 110, h_C[183]- not ok
[056] h_A[56] + h_B[56] = 112, h_C[184]- not ok
[057] h_A[57] + h_B[57] = 114, h_C[185]- not ok
[058] h_A[58] + h_B[58] = 116, h_C[186]- not ok
[059] h_A[59] + h_B[59] = 118, h_C[187]- not ok
[060] h_A[60] + h_B[60] = 120, h_C[188]- not ok
[061] h_A[61] + h_B[61] = 122, h_C[189]- not ok
[062] h_A[62] + h_B[62] = 124, h_C[190]- not ok
[063] h_A[63] + h_B[63] = 126, h_C[191]- not ok
PASSED


2개씩 3개 블럭을 사용해도 제대로 나온다.
__global__ void VecAdd(const int* A, const int* B, int* C, int N)
{
int i = blockIdx.x * blockDim.x + threadIdx.x;
C[i] = A[i] + B[i];
}
VecAdd<<<3,2>>>(d_A, d_B, d_C, N);

Vector addition
[000] h_A[0] + h_B[0] = 0, h_C[0]
[001] h_A[1] + h_B[1] = 2, h_C[2]
[002] h_A[2] + h_B[2] = 4, h_C[4]
[003] h_A[3] + h_B[3] = 6, h_C[6]
[004] h_A[4] + h_B[4] = 8, h_C[8]
[005] h_A[5] + h_B[5] = 10, h_C[10]
[006] h_A[6] + h_B[6] = 12, h_C[134]- not ok
[007] h_A[7] + h_B[7] = 14, h_C[135]- not ok
[008] h_A[8] + h_B[8] = 16, h_C[136]- not ok
[009] h_A[9] + h_B[9] = 18, h_C[137]- not ok
[010] h_A[10] + h_B[10] = 20, h_C[138]- not ok
[011] h_A[11] + h_B[11] = 22, h_C[139]- not ok
[012] h_A[12] + h_B[12] = 24, h_C[140]- not ok
[013] h_A[13] + h_B[13] = 26, h_C[141]- not ok
[014] h_A[14] + h_B[14] = 28, h_C[142]- not ok
[015] h_A[15] + h_B[15] = 30, h_C[143]- not ok
[016] h_A[16] + h_B[16] = 32, h_C[144]- not ok
[017] h_A[17] + h_B[17] = 34, h_C[145]- not ok
[018] h_A[18] + h_B[18] = 36, h_C[146]- not ok
[019] h_A[19] + h_B[19] = 38, h_C[147]- not ok
[020] h_A[20] + h_B[20] = 40, h_C[148]- not ok
[021] h_A[21] + h_B[21] = 42, h_C[149]- not ok
[022] h_A[22] + h_B[22] = 44, h_C[150]- not ok
[023] h_A[23] + h_B[23] = 46, h_C[151]- not ok
[024] h_A[24] + h_B[24] = 48, h_C[152]- not ok
[025] h_A[25] + h_B[25] = 50, h_C[153]- not ok
[026] h_A[26] + h_B[26] = 52, h_C[154]- not ok
[027] h_A[27] + h_B[27] = 54, h_C[155]- not ok
[028] h_A[28] + h_B[28] = 56, h_C[156]- not ok
[029] h_A[29] + h_B[29] = 58, h_C[157]- not ok
[030] h_A[30] + h_B[30] = 60, h_C[158]- not ok
[031] h_A[31] + h_B[31] = 62, h_C[159]- not ok
[032] h_A[32] + h_B[32] = 64, h_C[160]- not ok
[033] h_A[33] + h_B[33] = 66, h_C[161]- not ok
[034] h_A[34] + h_B[34] = 68, h_C[162]- not ok
[035] h_A[35] + h_B[35] = 70, h_C[163]- not ok
[036] h_A[36] + h_B[36] = 72, h_C[164]- not ok
[037] h_A[37] + h_B[37] = 74, h_C[165]- not ok
[038] h_A[38] + h_B[38] = 76, h_C[166]- not ok
[039] h_A[39] + h_B[39] = 78, h_C[167]- not ok
[040] h_A[40] + h_B[40] = 80, h_C[168]- not ok
[041] h_A[41] + h_B[41] = 82, h_C[169]- not ok
[042] h_A[42] + h_B[42] = 84, h_C[170]- not ok
[043] h_A[43] + h_B[43] = 86, h_C[171]- not ok
[044] h_A[44] + h_B[44] = 88, h_C[172]- not ok
[045] h_A[45] + h_B[45] = 90, h_C[173]- not ok
[046] h_A[46] + h_B[46] = 92, h_C[174]- not ok
[047] h_A[47] + h_B[47] = 94, h_C[175]- not ok
[048] h_A[48] + h_B[48] = 96, h_C[176]- not ok
[049] h_A[49] + h_B[49] = 98, h_C[177]- not ok
[050] h_A[50] + h_B[50] = 100, h_C[178]- not ok
[051] h_A[51] + h_B[51] = 102, h_C[179]- not ok
[052] h_A[52] + h_B[52] = 104, h_C[180]- not ok
[053] h_A[53] + h_B[53] = 106, h_C[181]- not ok
[054] h_A[54] + h_B[54] = 108, h_C[182]- not ok
[055] h_A[55] + h_B[55] = 110, h_C[183]- not ok
[056] h_A[56] + h_B[56] = 112, h_C[184]- not ok
[057] h_A[57] + h_B[57] = 114, h_C[185]- not ok
[058] h_A[58] + h_B[58] = 116, h_C[186]- not ok
[059] h_A[59] + h_B[59] = 118, h_C[187]- not ok
[060] h_A[60] + h_B[60] = 120, h_C[188]- not ok
[061] h_A[61] + h_B[61] = 122, h_C[189]- not ok
[062] h_A[62] + h_B[62] = 124, h_C[190]- not ok
[063] h_A[63] + h_B[63] = 126, h_C[191]- not ok
PASSED

원래는 32개씩 묶여서 원하는 수량대로만 돌라고
커널 코드에 if(i<N) 식으로 제한이 되어있는줄 알았는데, 없어도 의도한 대로는 돈다.
물론 돌아야 할 데이터의 갯수가 grid.x * gird.y * thread.x * thread.y 의 갯수만큼
떨어지지 않는다면 제한을 두어야겠지만 말이다.

결론 : warp은 최소단위로 묶이는 쓰레드의 갯수이긴 하지만, 실제로 그 이하로도 묶인다.
         블럭단위라고 해서 달라지는건 없는듯?
Posted by 구차니
Programming/openCL & CUDA2011. 1. 17. 22:45
CUDA Device에는 수 많은(?) 종류의 메모리가 있다.
이러한 메모리들의 특성에 대해 정리한 도표이다.
출처는 NVIDIA_CUDA_C_BestPracticesGuide.pdf 파일

의외(?)로 Local 메모리가 Local에 존재하지 않는다는 쇼킹한 이야기 -_-
쓰레드에 사용하는 메모리이지만, Off chip 즉 Device memory에 존재한다.


Posted by 구차니
Programming/openCL & CUDA2011. 1. 16. 22:11
CUDA의 kernel 부분에서 사용되는 내장변수는 다음과 같다.
아직 내용이 헷갈리지만 -_-

kernel<<<grid, thread_block>>>(vars, ... );

이런식으로 커널을 사용하는데
현재 block의 인덱스는 blockIdx에
현재 thread의 인덱스는 threadIdx에 들어간다.

blockDim 에는 전체 블럭의 카운트 값이 들어가는데
그렇다면 쓰레드의 전체 카운트 값은 어디에 들어갈려나?

아래는 Programming Guid에서 검색한 kernel 코드의 인덱스 부분
int row = blockIdx.y * blockDim.y + threadIdx.y
int col = blockIdx.x * blockDim.x + threadIdx.x;


Posted by 구차니
Programming/openCL & CUDA2011. 1. 16. 10:11
귀찮아서 CUDA 3.2 SDK만 설치하고, CUDA Toolkit 3.2는 설치하지 않고
비쥬얼 스튜디오에서 3.2용 SDK 샘플 파일을 열려고 하니 다음과 같은 에러가 발생한다.

음.. C:\Program Files\Microsoft Visual Studio 9.0\VC\VCProjectDefaults\NvCudaRuntimeApi.rules 이 파일은 머지?

머 결론은 프로젝트 파일 열수 없음 배째! 라는 건데..

3.1과 3.2의 프로젝트 파일을 비교해보니
ToolFiles의 경로가 달라졌다 -_-

부랴부랴 Toolkit 3.2를 설치하는데

경로를 바꾸니 졸라 겁준다 -_-
줸장! 내가 쫄아서 "Yes" 누르는 건 아냐 ㅠ.ㅠ

아무튼 3.2 Toolkit을 설치하고 나니 이제야 파일이 생성되고, 제대로 프로젝트 파일이 열린다.

Posted by 구차니
Programming/openCL & CUDA2011. 1. 14. 21:32
아래의 것들이 추가되었음

bilateralFilter
conjugateGradient
cudaEncode
Interval
MonteCarloCURAND
randomFog
simplePrintf
simpleSurfaceWrite
SLID3D10Texture
VFlocking

H.264 지원으로는 cudaEncode 정도 밖에 없는 느낌?


Interval.exe GTX260 이상부터 지원하는 녀석이다 ㅠㅠ
[Interval Computing]  starting ...

> Using CUDA device [0]: GeForce 8800 GT
> GPU Device has Compute Capabilities SM 1.1

Interval Computing: requires minimum of Compute Capability 1.3 or higher, waiving test...
PASSED


Posted by 구차니
Programming/openCL & CUDA2011. 1. 14. 18:11
버전별로 캡쳐(오픈오피스 쓰니 오작동해서 ㅠ.ㅠ)
8800GT는 CUDA1.1을 지원하므로.. 표를 따라서 보면

블럭당 쓰레드 256개
멀티프로세서당 쓰레드 768개

쓰레드당 레지스터 8개
블럭당 쉐어드 메모리 1024Byte

멀티프로세서당 Warp 24개
멀티프로세서당 쓰레드 블럭 3개

Warp당 쓰레드 32
멀티프로세서당 Warp 24
멀티프로세서당 쓰레드 768
멀티프로세서당 32bit 레지스터의 총합 8192개
멀티프로세서당 쉐어드 메모리 16384Bytes

쓰레드 블럭당 Warp 8
레지스터 2048
쉐어드 메모리 1024

흐음.. 이렇게 보니 조금 프로그래밍의 방향이 보이는 느낌?








Posted by 구차니
Programming/openCL & CUDA2011. 1. 5. 22:58
영어로 쏼라쏼라 해대는 바람에 프리젠테이션 내용은 이해불가 -_-
하지만 아래 내용만큼은 중요한 의미를 포함!

소프트웨어와 하드웨어의 추상화 과정은 다음과 같다.
Grid는 Device 이며, 한번에 하나의 Kernel 만을 (다르게 말하면 Grid를) 실행 할 수 있다.
   다르게 말하자면, 한번에 최대한 많은 블럭과 쓰레드를 사용하는 것이 시간효용면에서 유리해진다.
Thread Block은 Multiprocessor 이며,
   물리적 프로세서이므로 하나의 메모리를 공유한다(Shared Memory)
   그리고 다른 물리적 프로세서와는 메모리를 공유하지 못한다.
Thread는 Thread Processor 이며, 다른 자료에서 굳이 비유하자면 ALU 이다.

그런데.. Multi GPU 상황(그러니까 SLI를 사용하지 않는 다중 GPU)이라면
Grid를 동시에 여러개 구성해서 돌릴수도 있다는 의미일려나?



[링크 : http://http.download.nvidia.com/developer/cuda/podcasts/CUDA_Programming_Model_Overview.m4v]
2011/01/05 - [Programming/CUDA / openCL] - CUDA training

'Programming > openCL & CUDA' 카테고리의 다른 글

CUDA SDK 3.2 예제파일 변경점  (0) 2011.01.14
CUDA_Occupancy_calculator 내용 캡쳐  (0) 2011.01.14
CUDA training  (0) 2011.01.05
Visual Studio 2008 에서 CUDA 프로젝트 만들기  (2) 2011.01.04
CUDA Toolkit 3.2  (0) 2011.01.02
Posted by 구차니
Programming/openCL & CUDA2011. 1. 5. 16:30
도대체 어떻게 짱박아 놓았길래 안보인걸까..

Posted by 구차니
Programming/openCL & CUDA2011. 1. 4. 23:09
CUDA 프로젝트를 보면 다음과 같이, "CUDA Build Rule" 이라는 항목이 추가되있다.

명령줄에 보면 "nvcc.exe" 에 대한 언급도 나오는데 어디서 어떻게 추가하는지는 알수가 없었다.

그래서 검색을 해보니,
솔루션 탐색기에서 "사용자 지정 빌드 규칙" 이라는 부분을 통해

"기존 파일 찾기"를 이용하여 Cuda.rules를 추가하면 하면 저러한 기능이 추가된다.

나의 경우에는
D:\CUDA\NVIDIA GPU Computing SDK\C\common\Cuda.rules 경로에 위치하였다.

'Programming > openCL & CUDA' 카테고리의 다른 글

CUDA Programming Model Overview 내용중 일부  (0) 2011.01.05
CUDA training  (0) 2011.01.05
CUDA Toolkit 3.2  (0) 2011.01.02
deviceQuery on 8600GT 512MB + CUDA 하드웨어 구조  (0) 2011.01.02
CUDA on Linux  (0) 2010.12.07
Posted by 구차니