• 북마크
  • 추가메뉴
어디로 앱에서 쉽고 간편하게!
애플 중고 거래 전문 플랫폼
오늘 하루 보지 않기
KMUG 케이머그

소프트웨어

[App 개발] CUDA, Supercomputing for the Masses (2)

본문

지난 1편에서는 첫 번째 CUDA 예제 moveArray.cu 를 소개하면서 CUDA 툴을 이용하여 프로그램을 만들고 실행하는 것을 연습하였습니다. C 프로그래머에게 그 프로그램은 단순히 CUDA API 를 호출하여 메모리를 할당하여 CUDA 장비와 데이터를 교환하는 것이었습니다. 툴을 이용하여 컴파일하고 실행하는 데 특별히 까다로운 부분은 없었습니다.

이번에는 몇 줄을 더 추가하여 CUDA 장치에서 간단한 계산을 수행하는 예제를 만들어 보겠습니다. 부동소수점 배열의 숫자를 하나씩 증가시키는 예제입니다. 하지만 이 예지는 CUDA 사용에 필요한 기본 구조 대부분의 내용 (데이터를 CUDA 장치로 전송, 계산을 수행, 결과를 얻어냄) 을 보여줄 것입니다.

좀 더 자세한 내용에 들어가기에 앞서, 먼저 다음을 이해하여야 합니다.

* 커널은 무엇인가? 커널은 CUDA 장치를 - 다수 쓰레드에서 병렬로 동시에 - 실행하기 위하여 호스트에서 호출하는 함수이다.
* 커널은 어떻게 호출하는가? 여기에는 커널의 이름과 실행 환경 설정 방법이 필요하다. 이번 글에서 실행 환경은 그룹 내 병렬 쓰레드 숫자와 그룹의 갯수이다. 환경 설정은 매우 중요한 내용이며 향후 글에서 좀 더 깊이 다룰 것이다.
* 호스트와 커널을 싱크로나이즈하는 방법

Listing One 의 예제에는 호스트 루틴 incrementArrayOnHost 와 커널 incrementArraysOnDevice 가 있습니다.

호스트 함수 incrementArrayOnHost 는 각각의 배열 번호에서 그 내용을 하나씩 증가시키는 간단한 내용입니다. 이 함수는 프로그램 마지막에서 커널이 CUDA 장치에서 올바르게 작업을 수행했는지를 검사하기 위해 작성되었습니다.

그 다음은 CUDA 커널인 incrementArrayOnDevice 입니다. CUDA 는 C 언어에 몇 가지 확장 기능을 제공합니다. 함수 형 지정자인 __global__ 은 CUDA 장치에서 실행되는 커널을 선언합니다. 커널은 호스트에서만 호출할 수 있습니다. 커널의 리턴은 반드시 void 로 선언합니다.

커널 incrementArrayOnDevice 는 incrementArrayOnHost 와 동일한 계산을 수행합니다. incrementArrayOnDevice 를 보시면, 루프가 없다는 것을 보실 것입니다. 왜냐하면 이 함수는 CUDA 장치 내의 쓰레드에서 동시에 실행되는 함수이기 때문입니다. 각각의 쓰레드는 고유 ID 가 있어서 배열 내 다른 인덱스를 계산하거나, 혹은 변수 인덱스가 벗어났을 때 대기할 것인지를 판단하는 데 사용됩니다. 이렇게 레지스터 변수 idx 에 담긴 고유 ID 를 이용하면 함수를 간단하게 만들 수 있습니다. idx 는 1 씩 증가시킬 배열 요소를 가리키는 인덱스로 활용됩니다. 쓰레드 개수가 배열보다 클 수 있으므로, 먼저 idx 를 커널로 전달되는, 배열 크기를 지정하는 변수인 N 과 비교해서 작업을 수행할 것인지를 판단합니다.

커널 호출과 환경 설정은 어떻게 할까요? 프로그램 흐름은 main 으로부터 순차적으로 시작해서 Part 2 of 2 라는 문장이 담긴 주석문 바로 다음 줄까지 계속됩니다.

// incrementArray.cu
#include
#include
#include
void incrementArrayOnHost(float *a, int N)
{
int i;
for (i=0; i < N; i++) a[i] = a[i]+1.f;
}
__global__ void incrementArrayOnDevice(float *a, int N)
{
int idx = blockIdx.x*blockDim.x + threadIdx.x;
if (idx}
int main(void)
{
float *a_h, *b_h; // pointers to host memory
float *a_d; // pointer to device memory
int i, N = 10;
size_t size = N*sizeof(float);
// allocate arrays on host
a_h = (float *)malloc(size);
b_h = (float *)malloc(size);
// allocate array on device
cudaMalloc((void **) &a_d, size);
// initialization of host data
for (i=0; i // copy data from host to device
cudaMemcpy(a_d, a_h, sizeof(float)*N, cudaMemcpyHostToDevice);
// do calculation on host
incrementArrayOnHost(a_h, N);
// do calculation on device:
// Part 1 of 2. Compute execution configuration
int blockSize = 4;
int nBlocks = N/blockSize + (N%blockSize == 0?0:1);
// Part 2 of 2. Call incrementArrayOnDevice kernel
incrementArrayOnDevice <<< nBlocks, blockSize >>> (a_d, N);
// Retrieve result from device and store in b_h
cudaMemcpy(b_h, a_d, sizeof(float)*N, cudaMemcpyDeviceToHost);
// check results
for (i=0; i // cleanup
free(a_h); free(b_h); cudaFree(a_d);

< Listing One: incrementArray.cu >

이제 incrementArrayOnDevice 를 CUDA 장치에 등록하게 됩니다. 여기서 CUDA 커널의 비동기 실행을 하는 C 언어 확장 기능이 소개됩니다. 먼저 커널의 이름과 실행 환경 설정을 <<< 과 >>> 사이에 넣습니다. nBlocks 와 blockSize 두 개의 변수가 실행 환경 설정에 지정되었습니다. 커널로 전달되는 인수들은 기본 C 함수 인수 전달 방식과 같이 ( ) 사이에 넣습니다. 이 예제에서 배열을 가리키는 전역 메모리 포인터 a_d 와 배열 길이를 나타내는 N 이 커널에 전달됩니다.

CUDA 장치가 아무 일도 하지 않고 있으므로 커널은 지정된 실행 환경 설정과 함수 전달 인수에 따라 즉시 실행하게 됩니다. 한편 호스트는 커널이 실행되자마자 다음 줄로 진행됩니다. 이 시점에서 CUDA 장치와 호스트는 각각의 루틴을 동시에 수행합니다. incrementArray.cu 의 경우 호스트는 곧바로 cudaMemcpy 를 호출하게 되는데, 이 함수는 장치 내 모든 쓰레드가 종료(incrementArrayOnDevice 에서 리턴)되어 바뀐 배열값이 호스트로 돌아올 때까지 기다립니다. 프로그램은 호스트의 incrementArrayOnHost 에서 순차적으로 만들어진 값과 CUDA 가 병렬로 incrementArrayOnDevice 에서 만든 값을 순차적으로 비교한 다음 종료합니다.

커널 실행시 실행 환경 설정 ( <<< >>> 사이에 지정한 nBlocks 와 blockSize ) 변수들 몇 가지 지정되었습니다. 이 변수들은 모든 커널에 유효하니다. nBlocks 와 blockSize 설정은 매우 세련된 방식인데, 왜냐하면 이렇게 함으로써 프로그램 재 컴파일 없이 개발자들이 하드웨어의 필요 한도를 지정할 수 있기 때문입니다. 이것은 CUDA 를 이용한 상업용 프로그램 개발에 핵심적인 요소입니다.

향후 살펴볼 것입니다만, 블럭 내 쓰레드들은 서로 통신 및 동기화할 수 있습니다. 이는 놀라운 소프트웨어 특성입니다만 그만큼 비싼 하드웨어가 필요합니다. 향후 더 비싼 장치들은 값싼 구형 장치들보다 더 많은 블럭 당 쓰레드 개수를 지원할 것입니다. 그리드 추상화 기법은 하드웨어 세대와 가격대에 무관하도록 프로그램 재 컴파일 없이 이와 같은 내용을 반영할 수 있게끔 합니다. 실제적으로 그리드는 동일한 차원과 크기의 블럭을 다루는 동일한 커널을 일괄 호출하며, 단일 커널 호출 당 실행되는 쓰레드 개수인 nBlocks 만큼 효과적으로 증대시킬 수 있습니다. 값싼 장치들은 한 개 혹은 수 개의 쓰레드만을 동시 처리할 수 있을 것이고, 향후 개발될 비싼 장치들은 더 많은 쓰레드를 호출할 수 있을 것입니다. 그리드 추상화 기법으로 소프트웨어를 구성할 경우, 동시 실행 가능한 쓰레드 갯수와 블럭 내 서로 협력해야 하는 최대 쓰레드 갯수, 두 가지 변수의 트레이드 오프에 대한 균형을 고려해야 합니다. 이 두 종류 변수의 영향을 인식하여야 합니다. 물론 알고리듬에 따라 필요한 요소가 달라지겠습니다만, 가능하다면 많은 쓰레드 블럭 갯수를 지정하도록 하십시오.

CUDA 장치의 커널 내에는 커널 호출시 환경 설정으로 전달되는 예약 변수들이 몇 종류 있습니다.

* blockIdx: 그리드 내 블럭 인덱스
* threadIdx: 블럭 내 쓰레드 인덱스
* blockDim: 블럭 내 쓰레드 갯수

이 변수들은 정수형 변수를 포함한 구조체입니다. 예를 들어 블럭은 3차원이므로 정수 x, y, z 를 갖습니다. 한편 그리드는 2차원이므로 정수 x, y 를 갖습니다. 이번 예제에서는 CUDA 장치로 전달되는 배열이 1차원이므로 x 만 사용됩니다. 2차원, 3차원 기능이 어떻게 사용될 것인지는 향후 다루겠습니다.

우리 예제에서 커널은 예약 변수들을 이용하여 쓰레드 인덱스 idx 를 다음과 같이 계산합니다.

int idx = blockIdx.x * blockDim.x + threadIdx.x;

nBlocks 는 그리드 내 블럭 개수, blockSize 는 블럭 내 쓰레드 개수입니다. 이번 예제에서는 호스트 코드에서 커널 호출 직전에 초기화됩니다.

int blockSize = 4;
int nBlocks = N/blockSize + (N%blockSize == 0?0:1);

N 이 blockSize 로 딱 떨어지게 나눌 수 없을 경우 nBlocks 계산시 블럭 하나를 더 추가합니다. 그러므로 경우에 따라서 블럭 내 몇 쓰레드는 아무 일도 하지 않게 됩니다.

확실히 이번 예제는 문제를 쉽게 하기 위하여 쓰레드 블럭 네 개 안에 맞도록 배열 크기를 쓰레드 갯수보다 적게 인위적으로 만든 것입니다. 확실히 심하게 간략화한 것이지만, 쉬운 코드를 이용하여 커널이 incrementArrayOnDevice 를 호출하는 방법을 살펴보겠습니다.

중요한 점은, 각각의 쓰레드는 장치 내에서 변수 a_d 를 모두 억세스할 수 있다는 점입니다. 커널 실행시 고유한 데이터 분리는 없습니다. 커널 프로그램을 짤 때 커널을 인식하고 계산의 병렬적 요소를 지정하는 것은 프로그래머에게 달려 있습니다.

그림 1 은 배열 내에서 어떻게 idx 를 계산하고 a_d 를 참조하는지 나타냅니다. (이 내용이 이해가 안 되신다면, printf 구문을 incrementArrayOnDevice 에 첨가하여 idx 변수와 변수 계산에 필요한 관련 값들을 출력해 보세요. 출력을 보시려면 컴파일 시 "make emu=1" 로 컴파일하시고 실행하세요. printf 출력을 보시려면 에뮬레이터 실행파일의 path 를 확실히 지정해 주셔야 합니다.)

다시 말씀드립니다만 커널 호출은 비동기식입니다. 커널 실행과 동시에 프로그램은 호스트 CPU 로 리턴됩니다. 이전 CUDA 호출이 종료되어 있다면 커널은 CUDA 장치에서 실행될 것입니다. 비동기식 커널 호출은 호스트와 장치간 동시 계산을 가능하게 하는 훌륭한 방식입니다. 이 예제에서 incrementArrayOnHost 를 incrementArrayOnDevice 호출 이후로 바꾸어 호스트와 장치가 계산을 중복 수행하게 함으로써 더 나은 성능을 이끌어낼 수 있습니다. 커널 내 작업에 필요한 시간에 따라, 호스트와 디바이스가 동시에 계산을 수행하게 하는 것이 가능합니다.

다음 글을 보실 때까지

* N 과 nBlocks 값을 변경해 보세요. 만약 이 값이 장치의 한계를 넘었을 때 어떤 일이 일어나는지 확인해 보세요.
* 크기가 다른 배열을 처리할 수 있는 루프를 넣는 방법을 생각해 보세요.
* CUDA 장치 메모리 종류를 확인해 보세요. (전역 메모리, 레지스터, 공유 메모리, 상수 메모리) CUDA occupancy calculator 를 살펴보시고 와 nvcc 의 -cubin 이나 --ptxas-option=-v 옵션으로 커널 내 레지스터 사용 갯수를 지정해 보세요.
0 0
로그인 후 추천 또는 비추천하실 수 있습니다.
포인트 228,692
가입일 :
2003-02-18 14:12:30
서명 :
미입력
자기소개 :
미입력

최신글이 없습니다.

최신글이 없습니다.

댓글목록 0

등록된 댓글이 없습니다.
전체 529 건 - 5 페이지
2009.08
17

열람중 [App 개발] CUDA, Supercomputing for the Masses (2)

지난 1편에서는 첫 번째 CUDA 예제 moveArray.cu 를 소개하면서 CUDA 툴을 이용하여 프로그램을 만들고 실행하는 것을 연습하였습니다. C 프로그래머에게 그 프로그램은 단순히 CUDA API 를 호출하여 메모리를 할당하여 CUDA 장비와 …

2009.08
16

[App 개발] CUDA, Supercomputing for the Masses (1)

CUDA, Supercomputing for the Masses Rob Farber April 15, 2008 CUDA 는 GPU 상에서 동작하는 소프트웨어를 쉽게 개발하는 기법을 제공합니다. C 와 같은 고급언어를 사용하면서도 멀티코어…

2009.08
15

[App 개발] Mac OS X 커널의 내부 (3)

- 인텔 프로세서 관련 XNU 가 i386 을 지원하기 시작한 것은 90 년대 중반 OpenStep 으로 판매되기 시작할 때부터이지만, Mac OS X 에 적용된 것은 애플이 인텔 프로세서를 채택한 2005/2006 년도부터입니다. 그리고 64 …

2009.08
14

[App 개발] Mac OS X 커널의 내부 (2)

- 아키텍쳐 "XNU" (X is Not Unix) 라는 이름의 Mac OS X 의 커널은 세 가지 요소 (Mach, BSD, I/O-Kit) 로 구성되어 있습니다. - Mach (GNU/HURD 를 제외하고) 아직까지 Mach 코드를…

2009.08
13

[App 개발] Mac OS X 커널의 내부 (1)

Mac OS X 커널의 내부 Mac OS X 에는 마하 커널, 마이크로 커널, FreeBSD 커널, C++, 64 비트, 유닉스,... 그리고 이 모든 것이 포함된 "XNU" 등 여러 전문용어가 담겨있습니다. Mac OS X 커널은 마하 커널도,…

2009.08
12

[App 개발] OS X 를 지원하지 않는 기종을 위한 커널 해킹 (7)

플랫폼 엑스퍼트는 IODTNVRAM 인스턴스를 new 구문으로 직접 생성하고 있으므로 둘은 강하게 연결되어 있습니다. /options 노드는 연결 과정에 참여하고 있지 않고 있으며, 따라서 IODTNVRAM 을 대체할 드라이버를 제공하는 쉬운 방법이 …

2009.08
11

[App 개발] OS X 를 지원하지 않는 기종을 위한 커널 해킹 (6)

- 프로퍼티 조정: 약간의 거짓말이 필요할 때 멤버 변수 외에도 Mac OS X 드라이버에는 IOService (모든 Mac OS X 드라이버의 수퍼클래스) 로부터 상속받은 프로퍼티 테이블을 가지고 있습니다. 프로퍼티를 억세스하는 멤버는 퍼블릭이…

2009.08
09

[App 개발] OS X 를 지원하지 않는 기종을 위한 커널 해킹 (5)

- Mac OS X 업데이트 문제: 오묘한 커널의 세계 기존 드라이버에서 서브클래스를 만들어 우회하는 기법의 가장 큰 장점은 애플이 Mac OS X 를 업데이트 하더라도 커널 익스텐션을 계속 사용할 수 있다는 점입니다. 애플이 제공하는 드라이버를…

2009.08
08

[App 개발] OS X 를 지원하지 않는 기종을 위한 커널 해킹 (4)

- 애플 드라이버 서브클래싱: CD-ROM 충돌이 일어난 경우 Mac OS X 정품을 미 지원 시스템에 설치하는 또 다른 어려운 과제가 바로 스커지 CD-ROM 장치에 CD 를 넣을 경우 시스템 패닉이 일어난다는 점입니다. 이것은 좀 어려운 문제…

2009.08
07

[App 개발] OS X 를 지원하지 않는 기종을 위한 커널 해킹 (3)

- 부팅 과정 따라가기: 정품 인스톨 CD 부팅 PatchedNVRAM.kext 뿐만 아니라 여러 개의 드라이버들을 고치거나 새로 만들어야 합니다. 대략 45,000 줄의 코드 분량의, 모두 30개의 커널 익스텐션을 손보아야 합니다. 미 지…

2009.08
06

[App 개발] OS X 를 지원하지 않는 기종을 위한 커널 해킹 (2)

... 수정된 코드를 PatchedAppleNVRAM 으로 컴파일하는 것은 어렵지 않았습니다. AppleNVRAM 클래스는 짧고 간결했기 때문에, 코드를 복사한 다음 수정해야 할 두 줄만 고쳐 주었습니다. 이제 어떻게 커널이 내 드라이버를 선택하…

2009.08
05

[App 개발] OS X 를 지원하지 않는 기종을 위한 커널 해킹 (1)

OS X 를 지원하지 않는 기종을 위한 커널 해킹 Ryan Rempel (Other World Computing) - 요약 OS X 가 더 이상 지원하지 않는 기종에서 OS X 를 사용하기 위해서는 커널과 몇 가지 IOKit 익스텐션을 변경해…

2009.07
30

[App 개발] 책소개를 부탁드립니다.

코코아 공부를 시작하려고 하는데 뭐부터 시작할지 모르겠네요 도움이 될만한 책좀 소개해 주세요 감사합니다.

2009.06
14

[App 개발] 부산지역 아이폰 개발자 스터디 2기 참여자를 모집합니다.(개발 무경험자 및 초보가능)

안녕하세요... 가입기간도 좀 되었고 매일 들르는 곳이지만 이제야 두번째 글을 남기는 유령())회원 입니다... ㅡ,.ㅡ; 저는 아이폰 개발자 카페 맥부기에서 부산지역 아이폰 개발자 스터디 팀장을 하고있구요. 이번에 저희 스터디에서 아이폰개…

2009.04
14

[App 개발] 안녕하세요 자바 컴파일 질문입니다.

안녕하세요 맥으로 자바를 한번 컴파일 해볼려고 하는데 잘 안되어서 이렇게 질문 드립니다. 찾아 보니 저에게 맞는 답이 없어서 다시 질문 드립니다. 자바 파일을 하나만 달랑 만들고 나서 컴파일을 시킬려고 하니 되지 않더군요 그래서 전 하나…

2009.04
13

[App 개발] 아이폰 개발자 모임 [데브앱]을 소개합니다. ^^

안녕하세요. 국내 아이폰 개발자들의 모임 데브앱을 소개합니다. 아이폰 어플리케이션 개발에 관심있는 분들이시면 누구나 환영합니다. http://devapp.org

2009.03
25

[App 개발] Core animation 을 Quicktime 동영상으로 저장하려 하는데요.

코어 애니메이션이 UI용 이라는건 알긴 하지만..-_-;; 윈도우나 뷰, 컨텍스트에서 렌더링되는 코어 애니메이션 효과를 퀵타임 동영상으로 저장하려고 구글형님께 물어보니 http://www.cimgf.com/2009/02/03/re…

2009.02
16

[App 개발] SSE 최적화 (0) 서

맥이 인텔 프로세서를 사용한 지 어언 수 년이 흐르고, 이제 자연스럽게 인텔 프로세서의 장점을 십분 활용하는 방법을 강구하여야 하겠습니다. 예전에 제가 본 게시판에 게재했던 '코드 최적화' 글들을 같이 참조하시면 도움이 되실 것입니다. 대장…

2009.01
27

[App 개발] xcode 2.5버전인 cocoa programming 책 구하기가 어렵군요.

맥 프로그래밍에 관심이 많아져서 처음 입문하려니 애로사항이 꽃핍니다. 처음이니 번역서를 보면서 시작해볼까...했는데, 기껏 구입한 책은 3판인지라 3.x버전을 기준으로 되어있더군요. Xcode 3.1을 설치해보고 싶어도 레오파드가 설치되지 않는 파…

2008.11
29

[App 개발] Xcode를 사용하여 한글화 작업하기

제가 사용하는 일본어 프로그램이 있습니다. 제가 전공이 일본어학이라 프로그램 사용엔 별문제가 없지만 주위에서 같이 작없하는 사람들은 일본어를 전혀 모릅니다. 일본어 프로그램을 한글화 하고 싶지만 일본 본사에서는 한글화 예정이 없다고 합니다.…

2008.11
26

[App 개발] [질문] 학교에서 c언어를 배워서 x-code로 해볼려고 합니다

학교에서 c언어를 배우는데요. 비주얼 c++를 사용해서 다음과 같이 실행하였습니다. x-code에서 프로젝트를 carbon c++ standard application으로 한 다음에 새파일은 c++로 했거든요. 학교에서 배우는 것은 단지 커…

2008.11
25

[App 개발] cocoa프로그래밍 공부하려고하는데요

제가 cocoa 프로그래밍 공부하려고하는데 지금팔고있는 번역된cocoa programming책은 xcode 2.5 버전으로 알고있는데 지금 나온 3.1버전 공부할때도 도움이될까요

2008.11
08

[App 개발] 간단한 이벤트 핸들러...

어떤 특정 종류 파일이 생성될 때 간단한 애플스크립트나 오토메이터 웍플로를 실행시키고자 하는데, 애플스크립트가 그런 이벤트를 핸들링을 못 하는것 같더군요. (아니면 말씀해주세요) 그래서 오브젝팁씨로 만들어야 할 것 같은데, 제가 코코아에 대해 …

2008.10
14

[App 개발] NSImage 를 비트맵으로 처리하는 방법

제가 아까 잠결에 본 질문글이 있었는데, 다시 자고나서 일어나보니 지우셨나봐요. 질문 내용을 정확히 이해하지 못하고 그냥 얼핏 보았는데, 대략 "NSImage" 객체에서 raw 비트맵 정보를 끄집어내서 작업하고 싶어하시는 것 같던데, 맞나요 …

2008.10
10

[App 개발] [질문] WebView Class를 사용할 때 _blank링크의 처리

안녕하세요. 제가 지금 WebView(Custom view 오브젝트랑 연결)를 이용해서 커스텀 브라우저를 만드는 중인데요 표시하는 web페이지 내에 _blank링크나 JavaScript에 의한 popup이 있을 때 처리 방법이 궁금해서 질문 …

2008.09
26

[App 개발] 앱스토어에 어플 등록하시는 분들 많으신가요?

안녕하세요, 신입 회원입니다. 사실 저는 애플2 이후로 애플 제품을 써본적이 없는데요, 앱스토어의 폭발적인 성장에 발담가볼까 싶어서 시작했습니다. 안되더라도 아이팟 터치랑 맥북 하나 정도는 건지지 않을까 싶어서리... 근데 느낌이 레드 오션에 발…

2008.09
24

[App 개발] 하나의 파일(h/m합쳐서)에 복수의 클레스 선언이 가능한가요?

onefile.h파일에서 @interface class1 ---- ---- @end @interface class2 ==== ==== @end 하고 onefile.m파일에서 @implementation class…

2008.09
23

[App 개발] UIView와 UIViewController의 차이점이 궁금합니다..

어느 경우에 UIView를 쓰는지 어떤 때에 UIViewController를 사용하는지 궁금합니다.. 강좌들을 보면 어떨 때는 UIView, 또 어떨때는 UIViewController를 사용하는데 근본적인 이유를 모르니까 이해가 잘 안되는군요.. …

2008.09
22

[App 개발] IMK 가 정확히 어떤 것을 하는 라이브러리인가요?

입력기를 만드는데 쓰는 거란 것쯤은 알지만 정확히 어떤 기능을 하고 동작하는지 잘 모르겠습니다. 가이드는 없고 레퍼런스로만 있어서..-_-;(샘플은 하나 있는 거 같았는데...) IME 나 TSF 랑 비슷한 건가요 현재 입…

2008.09
22

[App 개발] Object-C 정말 짜증나네요..ㅠ

Object-C syntax 정말 짜증나네요...ㅠ JAVA에 익숙해져 있는 저에게는 정말..-_-+++ 메소드 call하는데 눈알 빠지겠습니다.

2008.09
18

[App 개발] [질문]컨트롤 객체의 Object ID 정보를 받아오는 방법을 알려 주세요. ㅜ.ㅜ

안녕하세요. 얼마전에 질문 올리고 또 질문 드립니다. ^^; xib에서 설정한 object ID를 UI에 연결된 클래스에서 어떻게 알아 낼 수 있을까요 구체적으로 지금 제가 하려는 것이 NSButton 두개에서 같은 함수 action…

2008.09
12

[App 개발] Cocoa 트레이닝센타를 만드는 중

Cocoa 프로그래밍(Objective - C)을 못한다면 아이폰개발은 아예 생각도 안하는 게 좋을 것입니다. 국내개발자가 워낙 없어서 배우기도 만만치 않고.... NextStep시절부터 프로그래밍을 했던 개발자라면 최소 경력이 14년은 넘…

2008.09
10

[App 개발] Program Portal에서 질문

아이폰 Developer Program Standard를 드디어 액티베이션 했습니다 Program Portal에서 이제 어떻게 뭘 먼저 해야하고 해야하는지 모르겠네요. 저의 App을 올리고픈데, 이제 프로그램 포탈에서 제가 할 일은 무엇인가…

2008.09
05

[App 개발] [질문]기본 브라우저를 사용해서 URL 호출 방법

제목 그대로 입니다. 시스템에 설정된 기본 브라우저를 사용해서 URL을 호출하려고 하는데 어떻게 해야 되나요 Windows에서는 브라우저를 shellexcute로 실행하면서 파라미터로 URL을 준다던가 하면 되는데 맥은 어떻게 되는지요

2008.09
05

[App 개발] iPhone Dev Program Standard 샀는데요

아이폰 Developer Program Standard program 으로 샀는데요. 유료로 99달러 내구요. 아직 이메일로 날라오진 않았는데요 어떤 형태로 날라오나요. 그리고 근데 이걸 올리려면 어떻게 해야하나요 …

2008.09
04

[App 개발] iPhone App 개발 관련 질문

아이폰 앱을 개발중인데요, 인터페이스 빌더로 이미지를 가져왔는데요, 앱을 사용해볼때 핀칭이나 더블탭으로 확대를 할 수 있게 하는 법 좀 가르쳐주세요. 또 아이콘 만드는 법도 알고 싶습니다. 꼭 부탁()드립니다.

2008.09
01

[App 개발] 맥개발자 모임에 관심있는 분들을 초대합니다.

안녕하세요 맥개발자 모임 맥부기 카페의 운영자 입니다. 저도 맥을 잘 모르는 1인으로서 맥개발에 관심을 갖던 중 우연치 않게 카페를 만들고 관심있는 분들을 모시고 첫번째 오프라인 모임을 잘 마치고 지금 스터디 회원분들을 계속해서 모집하고 …

2008.08
28

[App 개발] (카본 - 오픈gl) 마우스 좌표를 강제 변환 가능할까요?

오픈gl 공부겸 간단한 게임을 만드는 중 입니다. fps 게임 처럼, 마우스를 이용하여 카메라 방향을 바꾸려고 합니다. 제가 생각하는 방식을 위해서는, 현재 마우스 좌표를 읽어들이는 것 뿐만 아니라, 강제적으로 마우스 좌표를 변환 시켜야하는 …

2008.08
28

[App 개발] cocoa를 배워보고 싶습니다. 어디서부터 시작해야 할까요?

언어라던지 코딩이라던지 아무것도 배운적이 없는 초보입니다. 프로그램을 한번 제작해 보고 싶다는 생각을 가지고 서점에서 cocoa책을 봤는데 뭔지 하나도 모르겟더군요 할려면 완전 초보자가 시작해야 할 길을 좀 알려 주시면 감사하겠습니다.

2008.08
27

[App 개발] 아이폰 개발자 포럼 "데브앱"

안녕하세요. 아이폰 개발자들을 위한 포럼 "데브앱"이 오픈되었습니다. 포럼,위키,블로그 형태로 가이드 문서 번역과 튜터리얼 제작, 스터디, 정모등을 계획하고 있습니다. 관심있는 개발자 분들의 많은 참여 부탁 드립니다. http://w…

2008.08
19

[App 개발] [입문] 아이폰용 어플을 만들고 싶은데 어디서부터 시작하면 좋을까요?

안녕하세요. 코딩에 대해서는 완전 초보입니다만(어렸을 때 몇 번 시도했다가 포기했던 기억만이...) 아이폰용 어플을 만들고 싶어서요. 주변에 아는 프로그래머라도 있으면 원하는 형태를 주문할 수라도 있겠는데 그런 것도 아니고, 천상 제 힘으로 처음…

2008.08
14

[App 개발] Xcode 에서 c 프로그래밍을 하다가

막 코딩을 하던 찰나 콘솔화면 초기화가 안되더군요 윈도우에선 conio.h에 있던것들이라 안되는 모양입니다. 비슷한 ... 방법으로 콘솔화면을 초기화 해주는게 없을까요 system("cls"); cls 말고 무언가 다른게…

2008.08
13

[App 개발] 클레스 외부의 변수를 사용하네요? ;;;

애플에서 예제로 제공되는 코드를 보는 중입니다. ( SQLiteBooks ) 일단 AppDelegate.h에           @interface AppD…

2008.08
05

[App 개발] XCode의 에디터가 상당히 불편하네요.. -_-;;

이전에는 vc++로 개발을 하다가 요즘 XCode를 공부하고 있는데요.. 아직 손에 안익어서 그런거겠지만 VC++ IDE에 비해 너무 불편한것 같아요.. VC++에서 상당히 편하게 많이 쓰던 기능들인데 XCode 에서 못찾은 기능들입니다.. 혹시 있…

2008.07
31

[App 개발] aglUseFont 함수 사용법이 궁금합니다.

카본에서 오픈gl 프로그래밍을 공부하고 있습니다. 텍스트를 출력하기 위해 aglUseFont 함수를 사용하려고 하는데요, 함수 레퍼런스를 찾아보니, aglUseFont(AGLContext ctx, GLint fontID, 그 외 인자들...);…

2008.07
29

[App 개발] GLvoid, GLfloat 등등, GL타입은 어떤 다른 점이 있나요?

오픈gl 프로그래밍을 공부하다보니, 변수 타입에 GL을 붙여서 사용하는 경우가 있더군요. 이것은 기존의 타입과는 어떻게 다른건가요 특별한 장점이 있는지 궁금합니다.

2008.07
29

[App 개발] subclass NSObject를 만들려고 하는데 잘 안되네요.. -_-

아래 답변 달린것을 보고 그대로 따라해보려고 했는데 잘 안되네요.. -_- Library에서 Object를 Dock에다가 끌어다 놓거나 더블클릭을 하면 자물쇠 모양의 그림이 나오면서 추가가 안됩니다.. 어떻게 하면 Object를 추가할 수 있을…

2008.07
27

[App 개발] (카본, 오픈gl) 텍스쳐가 뒤집힙니다

카본 어플리케이션 프로젝트에서, 오픈gl로 프로그래밍 중 입니다. 면을 그릴 때, 시계 반대방향 순서로 버텍스를 생성해야, 면의 앞면이 앞으로(화면 방향으로) 오는 것으로 알고 있습니다. 또한, 텍스쳐 u - v 값은, 면의 각 꼭지점과 …

2008.07
25

[App 개발] 맥에서 mysql 사용시 한글 깨짐문제 질문드립니다.

인터넷과 몇몇 포럼에 문의하며 이래저래 바꾸어보아도 도저히 해결되지않아서 여기에도 질문을 드립니다. ㅠㅠ 우선 mysql 5.1버전을 dmg파일로 받아서 설치했습니다. 그리고 cocoaMySql도 설치했습니다. 기본적인 명령어는 잘 실행…

2008.07
24

[App 개발] .h파일에 선언하는 method에 대해 질문입니다.

코코아 프로그래밍 3판을 보고 있는데... 예를 들자면 AppController클레스를 만들었을때 .h파일과 .m파일이 만들어집니다. 그런데 책의 예제 코드를 보면 어떤 메소드는 .h에 선언을 해 놓고 또 어떤 메소드는 선언없이 그냥 .m파…