Nvidia Cuda GPU연산을 위한 기본 Core수를 알자.

NVIDIA Card
3000 Series
Number
of CUDA
Cores
Memory Type Memory
Interface
Width
Memory
Bandwidth
GB/sec
Base Clock
Speed
Boost Clock
Speed
NOTES
RTX-3050 2560 GDDR6 128 bit 224 GB/s 1550 MHz 1780 MHz Standard with 8 GB of Memory
RTX-3060 3584 GDDR6 192 bit 384 GB/s 1320 MHz 1780 MHz Standard with 12 GB of Memory
RTX-3060 Ti 4864 GDDR6 256 bit 448 GB/s 1410 MHz 1670 MHz Standard with 8 GB of Memory
RTX-3070 5888 GDDR6 256 bit 448 GB/s 1580 MHz 1770 MHz Standard with 8 GB of Memory
RTX-3070 Ti 6144 GDDR6X 256 bit 608 GB/s 1500 MHz 1730 MHz Standard with 8 GB of Memory
RTX-3080 8704 GDDR6X 320 bit 760 GB/s 1440 MHz 1710 MHz Standard with 10 GB of Memory
RTX-3080 Ti 10240 GDDR6X 384 bit 912 GB/s 1370 MHz 1670 MHz Standard with 12 GB of Memory
RTX-3090 10496 GDDR6X 384 bit 936 GB/s 1400 MHz 1700 MHz Standard with 24 GB of Memory
               
NVIDIA Card
2000 Series
Number
of CUDA
Cores
Memory Type Memory
Interface
Width
Memory
Bandwidth
GB/sec
Base Clock
Speed
Boost Clock
Speed
NOTES
RTX-2060 1920 GDDR6 192 bit 336 GB/s 1365 MHz 1680 MHz Standard with 6 GB of Memory
RTX-2060 Super 2176 GDDR6 256 bit 448 GB/s 1470 MHz 1650 MHz Standard with 8 GB of Memory
RTX-2070 2304 GDDR6 256 bit 448 GB/s 1410 MHz 1620 MHz Standard with 8 GB of Memory
RTX-2070 Super 2560 GDDR6 256 bit 448 GB/s 1605 MHz 1770 MHz Standard with 8 GB of Memory
RTX-2080 2944 GDDR6 256 bit 448 GB/s 1515 MHz 1710 MHz Standard with 8 GB of Memory
RTX-2080 Super 3072 GDDR6 256 bit 496 GB/s 1650 MHz 1815 MHz Standard with 8 GB of Memory
RTX-2080 Ti 4352 GDDR6 352 bit 616 GB/s 1350 MHz 1545 MHz Standard with 11 GB of Memory
Titan RTX 4608 GDDR6 384 bit 672 GB/s 1350 MHz 1770 MHz Standard with 24 GB of Memory
               
NVIDIA Card
1600 Series
Number
of CUDA
Cores
Memory Type Memory
Interface
Width
Memory
Bandwidth
GB/sec
Base Clock
Speed
Boost Clock
Speed
NOTES
GTX-1650 896 GDDR5 128 bit 128 GB/s 1485 MHz 1665 MHz Standard with 4 GB of Memory
GTX-1650 Super 1280 GDDR6 128 bit 192 GB/s 1530 MHz 1725 MHz Standard with 4 GB of Memory
GTX-1660 1408 GDDR5 192 bit 192 GB/s 1530 MHz 1785 MHz Standard with 6 GB of Memory
GTX-1660 Super 1408 GDDR6 192 bit 336 GB/s 1530 MHz 1785 MHz Standard with 6 GB of Memory
GTX-1660 Ti 1536 GDDR6 192 bit 288 GB/s 1500 MHz 1770 MHz Standard with 6 GB of Memory
               
NVIDIA Card
1000 Series
Number
of CUDA
Cores
Memory Type Memory
Interface
Width
Memory
Bandwidth
GB/sec
Base Clock
Speed
Boost Clock
Speed
NOTES
GTX-1010 384 GDDR5 64 bit 41.1 GB/s 1228 MHz 1468 MHz Standard with 2 GB of Memory
GTX-1030 384 GDDR5 64 bit 48 GB/s 1277 MHz 1468 MHz Standard with 2 GB of Memory
GTX-1050 2GB 640 GDDR5 128 bit 112 GB/s 1354 MHz 1455 MHz Standard with 2 GB of Memory
GTX-1050 3GB 768 GDDR5 96 bit 84 GB/s 1392 MHz 1518 MHz Standard with 3 GB of Memory
GTX-1050 Ti 768 GDDR5 128 bit 112 GB/s 1290 MHz 1392 MHz Standard with 4 GB of Memory
GTX-1060 3GB 1152 GDDR5 192 bit 192 GB/s 1506 MHz 1708 MHz Standard with 3 GB of Memory
GTX-1060 6GB 1280 GDDR5 192 bit 192 GB/s 1506 MHz 1708 MHz Standard with 6 GB of Memory
GTX-1070 1920 GDDR5 256 bit 256 GB/s 1506 MHz 1683 MHz Standard with 8 GB of Memory
GTX-1070 Ti 2432 GDDR5 256 bit 256 GB/s 1607 MHz 1683 MHz Standard with 8 GB of Memory
GTX-1080 2560 GDDR5 256 bit 320 GB/s 1607 MHz 1733 MHz Standard with 8 GB of Memory
GTX-1080 Ti 3584 GDDR5X 352 bit 484 GB/s 1480 MHz 1582 MHz Standard with 11 GB of Memory

https://www.studio1productions.com/Articles/NVidia-GPU-Chart.htm

 

NVidia Graphics Card Specification Chart - Studio 1 Productions and David Knarr

GTX 760 Ti 1344 500 watt DDR5 256 bit 192.2 GB/s 980 MHz 1033 MHz 2 GB Standard Memory Size GeForce 405 16 300 watt DDR3 64 bit 12.6 GB/s 580 MHz 1402 MHz OEM Video Card - Not Recommended GT 420 OEM 48 300 watt DDR3 128 Bit 700 MHz 1400 MHz OEM Video Card

www.studio1productions.com

 

 

'작업 > Cuda' 카테고리의 다른 글

Cuda Block Thread 설정.  (0) 2020.05.26
기존 Project Cuda Link時 오류  (1) 2020.05.06
CPU-GPU 속도 Test  (0) 2019.12.03
VS2017 - NVIDIA Cuda 연결  (0) 2019.12.03

Cuda Thread, Grid, Block 설정 시에 참고하세요.

Grid->Block->Thread와 각 Thread에 위치 정보와 Data 전달 개념을 잡아가야 합니다. 

 

그림 참조 : https://phychai.wordpress.com/2015/05/26/cuda-programming-thread-block-grid/

//=====================================================================================
//Cuda102.cuh
	typedef struct _XYPos_
	{
		int x;
		int y;

		int blockIdx_x;
		int blockDim_x;
		int threadIdx_x;

		int blockIdx_y;
		int blockDim_y;
		int threadIdx_y;
	}XYPos;
	class CudaProc
	{
	public:
		CudaProc(void);
		virtual ~CudaProc(void);
	//----------------------------------------------------------
	public:
		int ProcBlockThread(int nXCnt, int nYCnt, XYPos *pXYList);
	};



//=====================================================================================
//Cuda102.cu
__global__ 
void XYPosCheck(int nXCnt, int nYCnt, XYPos *pXYList)
{
	//1) 2차원 배열 접근 형태의 tidX와 tidY를 구한다.
	int tidX = blockIdx.x * blockDim.x + threadIdx.x;
	int tidY = blockIdx.y * blockDim.y + threadIdx.y;

	//2) tidX와 tidY는 16의 배수형태로 Thread가 할당되어 주어진 Memory보다 많게 된다.
	//  Count X와 Count Y의 범위 내에서만 메모리에 접근하여 Data를 체워준다.
	if (tidX < nXCnt && tidY < nYCnt)
	{
		pXYList[tidX + (nXCnt * tidY)].x = tidX;
		pXYList[tidX + (nXCnt * tidY)].y = tidY;

		pXYList[tidX + (nXCnt * tidY)].blockIdx_x = blockIdx.x;
		pXYList[tidX + (nXCnt * tidY)].blockDim_x = blockDim.x;
		pXYList[tidX + (nXCnt * tidY)].threadIdx_x = threadIdx.x;

		pXYList[tidX + (nXCnt * tidY)].blockIdx_y= blockIdx.y;
		pXYList[tidX + (nXCnt * tidY)].blockDim_y= blockDim.y;
		pXYList[tidX + (nXCnt * tidY)].threadIdx_y = threadIdx.y;
	
		float fAsphericZ_mm = K_Aspheric(12.3, (float)tidX, (float)tidY);
	}
}
__host__
int CudaProc::ProcBlockThread(int nXCnt, int nYCnt, XYPos *pXYList)
{
	int nCnt_X = nXCnt;
	int nCnt_Y = nYCnt;

	//1)처리를 위한 data 생성.
	int nThreadCnt = (nCnt_X*nCnt_Y);
	int nRetMemsize = nThreadCnt * sizeof(XYPos);

	XYPos  *C_pRet_XY = nullptr;
	cudaMalloc((void**)&C_pRet_XY, nRetMemsize);

	//2) Cudat Thread, Block 할당.

	dim3 threads(16, 16);

	int nGridCntX = nCnt_X / threads.x + (nCnt_X % threads.x > 0 ? 1 : 0);
	int nGridCntY = nCnt_Y / threads.y + (nCnt_Y % threads.y > 0 ? 1 : 0);
	dim3 grid(nGridCntX, nGridCntY);
	//a) 기본 Thread Count는 16*16의 크기로 256개를 잡는다.
	//b) grid는 입력된 X Data의 X성분을 16개의 X성분 Thread로 나누어 준다.
	//c) grid는 입력된 Y Data의 Y성분을 16개의 Y성분 Thread로 나누어 준다.
	//d) 나눈 나머지가 발생하면 Grid항목 1(thread 16개)을 추가 한다.
	//(XYPosCheck()안에서 tidX와 tidY의 법위가 넘는것은 Thread수의 배수로 증가 해서이다.)

	//3) Data 처리
	XYPosCheck << < grid, threads >> > (nXCnt, nYCnt, C_pRet_XY);

	//4) 결과 Data 전달.
	cudaMemcpy((void*)pXYList, (void*)C_pRet_XY, nRetMemsize, cudaMemcpyDeviceToHost);

	//5) 생성 메모리 처리.
	cudaFree(C_pRet_XY);
	return 1;
}
//=====================================================================================
//CudaTestDlg.cpp
void CCudaTestDlg::OnBnClickedBtCudaTest()
{
	CudaProc HWAccGPU;
	int nXCnt = 210;
	int nYCnt = 260;

	XYPos *pXYList= new XYPos[nXCnt * nYCnt];
	//Cuda Object
	HWAccGPU.ProcBlockThread(nXCnt, nYCnt, pXYList);

	for (int iy = 0; iy < nXCnt * nYCnt; iy++)
	{
		TRACE(L"==.....>>>>>>%d) X:%d, Y:%d\r\n", iy, pXYList[iy].x, pXYList[iy].y);
		TRACE(L"==.....            X) %d, %d, %d\r\n", 
        		pXYList[iy].blockIdx_x, pXYList[iy].blockDim_x, pXYList[iy].threadIdx_x);
		TRACE(L"==.....            Y) %d, %d, %d\r\n", 
        		pXYList[iy].blockIdx_y, pXYList[iy].blockDim_y, pXYList[iy].threadIdx_y);
	}

	delete[] pXYList;
}
//=====================================================================================
//결과

==.....>>>>>>0) X:0, Y:0
==.....            X) 0, 16, 0
==.....            Y) 0, 16, 0
==.....>>>>>>1) X:1, Y:0
==.....            X) 0, 16, 1
==.....            Y) 0, 16, 0
==.....>>>>>>2) X:2, Y:0
==.....            X) 0, 16, 2
==.....            Y) 0, 16, 0
==.....>>>>>>3) X:3, Y:0
==.....            X) 0, 16, 3
==.....            Y) 0, 16, 0
==.....>>>>>>4) X:4, Y:0
==.....            X) 0, 16, 4
==.....            Y) 0, 16, 0
==.....>>>>>>5) X:5, Y:0
==.....            X) 0, 16, 5
==.....            Y) 0, 16, 0
==.....>>>>>>6) X:6, Y:0
==.....            X) 0, 16, 6
==.....            Y) 0, 16, 0


...

== .....>>>>>>54594) X:204, Y : 259
== .....               X) 12, 16, 12
== .....               Y) 16, 16, 3
== .....>>>>>>54595) X:205, Y : 259
== .....               X) 12, 16, 13
== .....               Y) 16, 16, 3
== .....>>>>>>54596) X:206, Y : 259
== .....               X) 12, 16, 14
== .....              Y) 16, 16, 3
== .....>>>>>>54597) X:207, Y : 259
== .....              X) 12, 16, 15
== .....              Y) 16, 16, 3
== .....>>>>>>54598) X:208, Y : 259
== .....              X) 13, 16, 0
== .....              Y) 16, 16, 3
== .....>>>>>>54599) X:209, Y : 259
== .....              X) 13, 16, 1
== .....              Y) 16, 16, 3

1) 입력 Data는 54600개이고, X 210, Y 260개 Data라고 보면 된다.

2) XYPosCheck() 함수 안에서 tidX, tidY의  접근 인자들을 정상적으로 Memory에 표기하여 돌려보내준다.

3) X와 Y Data크기가 tidX, tidY와 같은 크기로 설정하여 적용하면 의미 없는 Thread는 없어지지만 원하는 속도가 나오기 힘들다.(2의 배수로 Threa Block이 할당된다.)

 

Thread Block Test
dim3 threads(64, 64); //==>>오동작
dim3 threads(32, 32); //==>>느려짐
dim3 threads(16, 16); //==>>보통
dim3 threads(8, 8); //==>>미미하게 빨라짐
dim3 threads(4, 4); //==>>느려짐

'작업 > Cuda' 카테고리의 다른 글

NVIDIA Cuda Cores 참고  (0) 2022.02.24
기존 Project Cuda Link時 오류  (1) 2020.05.06
CPU-GPU 속도 Test  (0) 2019.12.03
VS2017 - NVIDIA Cuda 연결  (0) 2019.12.03

uafxcwd.lib  error LNK2005

Link 추가 연결

 

'작업 > Cuda' 카테고리의 다른 글

NVIDIA Cuda Cores 참고  (0) 2022.02.24
Cuda Block Thread 설정.  (0) 2020.05.26
CPU-GPU 속도 Test  (0) 2019.12.03
VS2017 - NVIDIA Cuda 연결  (0) 2019.12.03

1차 Test

대상 : 644*484 Color이미지의 Red와 Green색상 변경.

코드 : CPU용 이중 for문으로 구성, GPU Cuda 병렬 처리 방식으로 구성.

속도 : CPU 3 msec, GPU 11 msec CPU가 빠르다.(debug, release 같은 현상)

       -> Memory 생성 복사가 추가 되었음으로 CPU 쪽에도 추가 ( 속도 변화 없음)

결론 : Data양이 적을때에는 CPU가 3배 이상 빠르다.(GPU로 메모리 복사가 생기지 않음으로)

     - CPU : 적은 Data, 복잡한 연산에 적합.

     - GPU : 다량의 Data, 단순(CPU에 비해) 연산에 적합.

 

2차 Test

대상 : 상동

코드 : 각 처리위치 반복 수행 제일 안쪽에서 같은 동작 1000회 반복.

속도 :  debug Mode : CPU 2438 msec, GPU 2829 msec

         Release Mode: CPU 1180msec, GPU 3 msec(393배 빠름)

 

*cudaDeviceSynchronize();로 GPU 동작 완료 체크.

 

CPU:2438msec, GPU:2829msec
CPU 1180msec, GPU 3msec(393배)

 

추가 : 이미지 크기 9999*7514 크기 Test

   1회교환

        Debug : CPU 930 msec, GPU  : 2598 msec

        Release : CPU 139 msec, GPU : 358 msec

   100회 교환

        Release : CPU 32288 msec, GPU : 378(최초 511) msec

   1000회 교환

        Release : CPU 측정 불가, GPU : 352 msec

 

Test 진행 코드

'작업 > Cuda' 카테고리의 다른 글

NVIDIA Cuda Cores 참고  (0) 2022.02.24
Cuda Block Thread 설정.  (0) 2020.05.26
기존 Project Cuda Link時 오류  (1) 2020.05.06
VS2017 - NVIDIA Cuda 연결  (0) 2019.12.03

1) Cuda 10.2 Download

OS와 현재 설정에 따라 맞게 설정 하여 Download

2) "cuda_10.2.89_441.22_win 10.exe"설치(2.5 GByte)

3) VS2017 설정 (Consol Test Project 생성 후)

지정 빌드 설정

4) Cuda Lib 추가.(Debug & Release : cuda.lib; cudart.lib; cublas.lib; cufft.lib)

링커 Lib 등록

5) Test.cuh, Test.cu 파일 추가.

확장자 *.cuh, *.cu로 설정 된다.

6) 기본 Test 코드 작성

Test용 Add 함수

7) 컴파일 및 실행

'작업 > Cuda' 카테고리의 다른 글

NVIDIA Cuda Cores 참고  (0) 2022.02.24
Cuda Block Thread 설정.  (0) 2020.05.26
기존 Project Cuda Link時 오류  (1) 2020.05.06
CPU-GPU 속도 Test  (0) 2019.12.03

+ Recent posts