'Programming'에 해당되는 글 1747건

  1. 2014.02.27 crt0.o / crtexe.obj
  2. 2014.02.26 c++ constructor
  3. 2014.02.25 const / pointer
  4. 2014.02.17 opencv docs
  5. 2014.02.15 cuda 6.0 rc
  6. 2014.02.08 Interoperability with OpenCV 1
  7. 2014.01.17 cuda + openmp 적용 예제
  8. 2014.01.17 cuda + openmp 프로젝트 생성은....
  9. 2014.01.16 cuda 1차원 데이터, 2차원 처리 예제 4
  10. 2014.01.15 CUDA 쓰레드 계산
Programming/C++ STL2014. 2. 27. 11:40
c의 경우 디버깅 시에 crt0.o를 호출하게 되는데
cpp의 경우 crtexe.c 파일로 디버깅이 연결된다.

crt는 C RunTime의 약자인데
crt 대신 다른게 될 줄 알았더니 먼가 싱겁... 


1>  LINK : D:\cpp\ch9\Debug\ch9.exe을(를) 찾을 수 없거나 마지막 증분 링크에 의해 빌드되지 않았습니다. 전체 링크를 수행하고 있습니다.
1>MSVCRTD.lib(crtexe.obj) : error LNK2019: _main 외부 기호(참조 위치: ___tmainCRTStartup 함수)에서 확인하지 못했습니다.
1>D:\cpp\ch9\Debug\ch9.exe : fatal error LNK1120: 1개의 확인할 수 없는 외부 참조입니다.
========== 빌드: 성공 0, 실패 1, 최신 0, 생략 0 ==========  

'Programming > C++ STL' 카테고리의 다른 글

c++ class / const member variable & function  (0) 2014.02.28
deep copy / shallow copy < object copy  (0) 2014.02.27
c++ constructor  (0) 2014.02.26
C++11 Lambda Fuction  (2) 2013.11.20
C++ AMP (Accelerated Massive Parallelism)  (0) 2013.10.08
Posted by 구차니
Programming/C++ STL2014. 2. 26. 10:49
클래스를 생성한뒤 값을 주거나
값을 주어 생성하는 경우 어떻게 다른가 테스트

일단.. operator= 와 같이
할당연산자가 기본으로 생성되어 그런건지 모르겠지만
클래스를 만들고 나서 값을 할당하는 경우와는 또 다르게 움직인다.

그리고 생성자가 마치 할당연산자 같이 작동하는 신기한 현상을 발견...
아아 c++ 어려워 ㅠㅠ

#include < iostream >

using namespace std;

class test
{
	int a1, a2;
	int a;

public:
	test()
	{
	}

	test(int b)
	{
		cout << "constructor called" << endl;
		a = b;
	}

	void dump()
	{
		cout << a1 << ' ' << a2 << ' ' << a << endl;
	}
};

void main()
{
	cout << "tt" << endl;
	test tt;

	cout << "t2(11)" << endl;
	test t2(11);

	cout << "tt = 11" << endl;
	tt = 11;

	cout << "tt = 55" << endl;
	tt = 55;

	tt.dump();
	t2.dump();
}

tt
t2(11)
constructor called
tt = 11
constructor called
tt = 55
constructor called
-858993460 -858993460 55
-858993460 -858993460 11 

생성자를 주석처리하여 실험해보면
operator= 일수도 있다고 연결되는 걸 봐서는... 쩝...
1>error C2679: 이항 '=' : 오른쪽 피연산자로 'int' 형식을 사용하는 연산자가 없거나 허용되는 변환이 없습니다.
1>          'test &test::operator =(const test &)'일 수 있습니다.
1>          인수 목록 '(test, int)'을(를) 일치시키는 동안 

[링크 : https://kldp.org/node/31436]
[링크 : http://skmagic.tistory.com/entry/복사생성자와-대입연산자의-차이]
[링크 : http://msdn.microsoft.com/ko-kr/library/c5at8eya.aspx ]

'Programming > C++ STL' 카테고리의 다른 글

deep copy / shallow copy < object copy  (0) 2014.02.27
crt0.o / crtexe.obj  (0) 2014.02.27
C++11 Lambda Fuction  (2) 2013.11.20
C++ AMP (Accelerated Massive Parallelism)  (0) 2013.10.08
c++ class - friend  (0) 2013.03.15
Posted by 구차니
Programming/C Win32 MFC2014. 2. 25. 10:37
c++ 레퍼런스를 보다 보니
포인터에 const가 붙으면 어떻게 접근보호가 될지 궁금해 검색을 해보니 똭! ㅋㅋ

const 포인터
const void *p = &ori;
포인터의 주소 변경 불가(레퍼런스 화?) 내용 변경 가능

포인터 const
void const *p;
포인터 주소 내의 내용  변경 불가

const 포인터 const
const void const *p
포인터 주소 및 주소 내의 내용 변경 불가

[링크 : https://kldp.org/node/48414]
[링크 : http://quoobit.egloos.com/1379839]

+ 특이사항으로는..
const 변수를
포인터로는 조작이 가능하다는거.. 당연한걸지도 모르겠지만... ㄷㄷㄷ 

int main()
{
        const int a = 0;
        int *p;

        p = &a;

        printf("%d %d\n",a,*p);

        *p = 2;
//      a = 1;

        printf("%d %d\n",a,*p);

        return 0;
} 

$ ./a.out
0 0
2 2

어짜피 const는 컴파일 타임에 결정되는 것 이기에
메모리 상에 주소로 접근시에는 해당 메모리 영역이 read-only인지 알 수 없기에
포인터로 (const 포인터 const라면 안되겠지만) const 영역의 데이터를 조작이 가능하다는 놀라운(?) 사실 ㄷㄷ

---
2014.3.5 추가
gcc 에서는 문제없이 되지만 vs2008에서는 에러가 난다. 
1> error C2440: '=' : 'const int *'에서 'int *'(으)로 변환할 수 없습니다.
1>        변환하면서 한정자가 손실됩니다. 

또한 gcc에서 되던 문법이 경고가 발생한다.
const int const *p1;
1> warning C4114: 동일한 형식 한정자를 두 번 이상 사용했습니다.  



'Programming > C Win32 MFC' 카테고리의 다른 글

2중 포인터 사용이유  (0) 2014.03.19
typeof  (0) 2014.03.11
assert()  (0) 2013.12.18
printf의 %s와 %S  (0) 2013.06.15
win32api - joystick 예제  (0) 2013.06.15
Posted by 구차니
Programming/openCV2014. 2. 17. 17:28
예전에 저장을 안해놨던가.?

[링크 : http://docs.opencv.org/]
  [링크 : http://docs.opencv.org/doc/tutorials/tutorials.html] html 버전의 tutorial
  [링크 : http://docs.opencv.org/java/] opencv java api

'Programming > openCV' 카테고리의 다른 글

OpenNI - Open Natural Interaction  (0) 2014.06.30
opencv2 웹캠 관련 문서  (0) 2014.06.28
Interoperability with OpenCV 1  (0) 2014.02.08
opencv2 on ubuntu  (2) 2013.11.10
openCV Mat / iplImage  (0) 2012.02.21
Posted by 구차니
Programming/openCL & CUDA2014. 2. 15. 22:10
아직 함정인가?
링크는 로그인 할 수 없다고 하네?
그나저나 이제야 조금 맛을 보았는데 금세 6.x 대라니 ㅠㅠ


Posted by 구차니
Programming/openCV2014. 2. 8. 23:26
OpenCV 와 OpenCV2는 같은 프로젝트 이지만
새로 갈아 엎으면서 하위호환을 위해 어느정도 제공은 하지만
그래도 만약 새롭게 공부 한다면 c++ 기반의 OpenCV2로 시작을 해야 할 듯 하다.

아무튼 opencv tutorial에 의하면
아래와 같이 기존의 IplImage 와 CvMat 구조체와 호환은 가능하다고 한다.

Mat I;
IplImage* pI = &I.operator IplImage();
CvMat* mI = &I.operator CvMat(); 

'Programming > openCV' 카테고리의 다른 글

opencv2 웹캠 관련 문서  (0) 2014.06.28
opencv docs  (0) 2014.02.17
opencv2 on ubuntu  (2) 2013.11.10
openCV Mat / iplImage  (0) 2012.02.21
openCV 글씨 쓰기 예제  (2) 2012.02.12
Posted by 구차니
Programming/openCL & CUDA2014. 1. 17. 19:41
어제 했던 소스에서 대충 openmp 적용해봄
2014/01/16 - [Programming/openCL / CUDA] - cuda 1차원 데이터, 2차원 처리 예제

CUDA Runtime API - Host - Extra C++ Options 에서 /openmp 를 추가하면 된다.

[링크 : https://devtalk.nvidia.com/.../vs2010-cuda4rc2-howto-compile-openmp-host-code...]

물론 #inclued <omp.h>를 추가하지 않으면
컴파일 시에는 문제가 없으나 실행시에 이런 문제가 발생한다.

[링크 : http://blog.naver.com/changfull7/70110120004]

openmp 적용
cpu Time : 0.048000
gpu Time : 0.001000 

openmp 미적용
cpu Time : 0.131000
gpu Time : 0.001000  


#include < stdio.h >
#include < stdlib.h >
#include < time.h >
#include < omp.h > #include "cuda_runtime.h" #define BLOCK_WID 128 #define THREAD_WID 32 #define ARRAY_SIZE (THREAD_WID * THREAD_WID * BLOCK_WID * BLOCK_WID) __global__ void kernel_test(int *a, int *b, int *c) { int idx = threadIdx.x +blockIdx.x * blockDim.x + (gridDim.x * blockDim.x) * (blockIdx.y * blockDim.y + threadIdx.y); c[idx] = a[idx] + b[idx]; } void main() { clock_t start_time, end_time; int *a, *b, *c, *res; int *dev_a,*dev_b,*dev_c; int idx = 0; dim3 block(BLOCK_WID,BLOCK_WID); dim3 thread(THREAD_WID,THREAD_WID); a = (int *)malloc(ARRAY_SIZE * sizeof(int)); b = (int *)malloc(ARRAY_SIZE * sizeof(int)); c = (int *)malloc(ARRAY_SIZE * sizeof(int)); res = (int *)malloc(ARRAY_SIZE * sizeof(int)); // initialize srand (time(NULL));
#pragma omp parallel for for(idx = 0;idx < ARRAY_SIZE ; idx++) { a[idx] = rand() & 0xFFFF; b[idx] = rand() & 0xFFFF; c[idx] = 0; } start_time = clock();
#pragma omp parallel for for(idx = 0;idx < ARRAY_SIZE ; idx++) { res[idx] = a[idx] + b[idx]; } end_time = clock(); printf("cpu Time : %f\n", ((double)(end_time-start_time)) / CLOCKS_PER_SEC); cudaMalloc(&dev_a, ARRAY_SIZE * sizeof(int)); cudaMalloc(&dev_b, ARRAY_SIZE * sizeof(int)); cudaMalloc(&dev_c, ARRAY_SIZE * sizeof(int)); cudaMemcpy(dev_a, a, ARRAY_SIZE * sizeof(int), cudaMemcpyHostToDevice); cudaMemcpy(dev_b, b, ARRAY_SIZE * sizeof(int), cudaMemcpyHostToDevice); start_time = clock(); kernel_test<<<block,thread>>>(dev_a,dev_b,dev_c); end_time = clock(); printf("gpu Time : %f\n", ((double)(end_time-start_time)) / CLOCKS_PER_SEC); cudaMemcpy(c, dev_c, ARRAY_SIZE * sizeof(int), cudaMemcpyDeviceToHost); for(idx = 0;idx < ARRAY_SIZE ; idx++) { if(res[idx] != c[idx]) { printf("%5d a:%5d b:%5d c:%5d", idx, a[idx], b[idx], c[idx]); if(res[idx] != c[idx]) printf(" != "); else printf(" == "); printf("r:%5d\n",res[idx]); break; } } cudaFree(dev_a); cudaFree(dev_b); cudaFree(dev_c); free(a); free(b); free(c); free(res); }

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

cuda 6.0 rc  (0) 2014.02.15
cuda + openmp 프로젝트 생성은....  (0) 2014.01.17
cuda 1차원 데이터, 2차원 처리 예제  (4) 2014.01.16
CUDA 쓰레드 계산  (0) 2014.01.15
visual studio 2008 nsight 실행..된거 맞나?  (0) 2014.01.15
Posted by 구차니
Programming/openCL & CUDA2014. 1. 17. 11:44
사용자 지정 빌드규칙을 추가하면 된다는데 빌드는 아직 안해봤고


문제는 cuda 프로젝트로 생성시


프로젝트에 디버깅 아래 C/C++이 존재하지 않는다.


아무튼.. C/C++ 의 언어에 OpenMP가 있으므로
CUDA와 OpenMP를 동시에 사용하려면 일반프로젝트 생성 + CUDA 사용자 룰 추가 이런식으로 해야 할 듯 하다.


결론 : 일단은.. openMP + CUDA는 생각하지 말자.. 귀차나 ㅠㅠ

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

cuda 6.0 rc  (0) 2014.02.15
cuda + openmp 적용 예제  (0) 2014.01.17
cuda 1차원 데이터, 2차원 처리 예제  (4) 2014.01.16
CUDA 쓰레드 계산  (0) 2014.01.15
visual studio 2008 nsight 실행..된거 맞나?  (0) 2014.01.15
Posted by 구차니
Programming/openCL & CUDA2014. 1. 16. 00:03
Phenum2 945(3.0Ghz) / GTX650

cpu Time : 0.131000
gpu Time : 0.001000

일단.. 싱글 코어로 돌려서 130msec 정도 
GPU로 돌려서 동일 연산이 1msec 미만으로 걸린다.. ㄷㄷㄷ

일단 32*32*128*128*4 로
총 1024개의 쓰레드를 동시에 돌리고
16,384 개의 블럭으로 연산을 한다.
67,108,864 byte 대략 64MB + 64MB = 64MB 용량의 연산을 하는 소스이다.

#include < stdio.h >
#include < stdlib.h >
#include < time.h >

#include "cuda_runtime.h"

#define BLOCK_WID	128
#define THREAD_WID	32
#define ARRAY_SIZE	 (THREAD_WID * THREAD_WID * BLOCK_WID * BLOCK_WID)

__global__ void kernel_test(int *a, int *b, int *c)
{
	int idx = threadIdx.x +blockIdx.x * blockDim.x + (gridDim.x * blockDim.x) * (blockIdx.y * blockDim.y + threadIdx.y);
	c[idx] = a[idx] + b[idx];
}

void main()
{
	clock_t start_time, end_time;
	int *a, *b, *c, *res;
	int *dev_a,*dev_b,*dev_c;
	unsigned int idx = 0;
	dim3 block(BLOCK_WID,BLOCK_WID);
	dim3 thread(THREAD_WID,THREAD_WID);

	a = (int *)malloc(ARRAY_SIZE * sizeof(int));
	b = (int *)malloc(ARRAY_SIZE * sizeof(int));
	c = (int *)malloc(ARRAY_SIZE * sizeof(int));
	res = (int *)malloc(ARRAY_SIZE * sizeof(int));

	// initialize
	srand (time(NULL));
	for(idx = 0;idx < ARRAY_SIZE ; idx++)
	{
		a[idx] = rand() & 0xFFFF;
		b[idx] = rand() & 0xFFFF;
		c[idx] = 0;
	}

	start_time = clock();
	for(idx = 0;idx < ARRAY_SIZE ; idx++)
	{
		res[idx] = a[idx] + b[idx];
	}
	end_time = clock();
	printf("cpu Time : %f\n", ((double)(end_time-start_time)) / CLOCKS_PER_SEC); 

	cudaMalloc(&dev_a, ARRAY_SIZE * sizeof(int));
	cudaMalloc(&dev_b, ARRAY_SIZE * sizeof(int));
	cudaMalloc(&dev_c, ARRAY_SIZE * sizeof(int));

	cudaMemcpy(dev_a, a, ARRAY_SIZE * sizeof(int), cudaMemcpyHostToDevice);
	cudaMemcpy(dev_b, b, ARRAY_SIZE * sizeof(int), cudaMemcpyHostToDevice);

	start_time = clock();
	kernel_test<<<block,thread>>>(dev_a,dev_b,dev_c);
	end_time = clock();
	printf("gpu Time : %f\n", ((double)(end_time-start_time)) / CLOCKS_PER_SEC); 

	cudaMemcpy(c, dev_c, ARRAY_SIZE * sizeof(int), cudaMemcpyDeviceToHost);

	for(idx = 0;idx < ARRAY_SIZE ; idx++)
	{
		if(res[idx] != c[idx])
		{
			printf("%5d a:%5d b:%5d c:%5d", idx, a[idx], b[idx], c[idx]);
			if(res[idx] != c[idx])
					printf(" != ");
			else	printf(" == ");
			printf("r:%5d\n",res[idx]);
			break;
		}
	}

	cudaFree(dev_a);
	cudaFree(dev_b);
	cudaFree(dev_c);

	free(a);
	free(b);
	free(c);
	free(res);
}

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

cuda + openmp 적용 예제  (0) 2014.01.17
cuda + openmp 프로젝트 생성은....  (0) 2014.01.17
CUDA 쓰레드 계산  (0) 2014.01.15
visual studio 2008 nsight 실행..된거 맞나?  (0) 2014.01.15
nsight 설치... -_-  (0) 2014.01.15
Posted by 구차니
Programming/openCL & CUDA2014. 1. 15. 21:58
머리를 데굴데굴 굴려봐도 깔끔한 계산식이 안나온다..
걍 2차원 배열로 하는수 밖에 없으려나?

일단 1차원으로 할당한 녀석을 2차원 block/thread 로 구성시에 대한 수식이다.

threadIdx.x +blockIdx.x * blockDim.x
+ (gridDim.x * blockDim.x) * (blockIdx.y * blockDim.y + threadIdx.y);

근데.. 걍.. 데이터를 2차원 으로 해서 하는게 속 편할지도 모르겠네...


뻘짓 끝에 디버거로 돌려보니..
blockIdx 에는 thread block의 dimension이 들어간다....

다시 글들을 보니..
block에 대한 카운트와 인덱스는 gridDim blockIdx에서
thread에 대한 카운트와 인덱스는 blockDim threadIdx 에서 내장변수로 제공한다.

---
끄아아.. 벌써 세번째 글이었구나 ㅠㅠ

2011/01/16 - [Programming/openCL / CUDA] - CUDA 내장변수 - built in variable
2012/04/30 - [Programming/openCL / CUDA] - cuda 내장변수 
Posted by 구차니