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

소프트웨어

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

본문

- 광역 메모리와 CUDA 프로파일러

이번 6회에서는 메모리 성능과 reverseArray_multiblock_fast.cu 에서 공유 메모리를 사용하는 것을 살펴보겠습니다. 이번에는 CUDA 프로파일러를 이용하여 광역 메모리를 점검할 것입니다.

눈치 빠른 독자분들은 이미 우리가 4회와 5회에서 살펴본 배열 뒤집기를 생각하시고 어째서 공유 메모리가 광역 메모리보다 빠른지 궁금해하실 겁니다. 공유 메모리 버젼 reverseArray_multiblock_fast.cu 에서 커널은 광역 메모리에서 공유 메모리로 데이터를 복사하고 결과를 다시 광역 메모리로 되돌려 놓지만, reverseArray_multiblock.cu 에서는 광역 메모리에서 광역 메모리로 데이터를 한 번만 복사하기 때문입니다. 광역 메모리 속도가 공유 메모리에 비해 100 에서 150배 정도 느리므로 광역 메모리 억세스 과정이 두 가지 예제에서 가장 속도를 잡아먹는 과정이 되어야 하는데, 어째서 공유 메모리 버젼이 더 속도가 빠를까요?

이 문제에 답하기 위해서는 광역 메모리에 대한 이해와 CUDA 개발장비에서 제공하는 CUDA 프로파일러 사용법을 익히셔야 합니다. CUDA 소프트웨어를 프로파일링하는 것은 빠르고 쉽습니다. 텍스트와 그래픽 버젼으로 제공되는 소프트웨어는 CUDA 장치의 하드웨어 프로파일 카운터를 읽어들입니다.텍스트 프로파일링은환경 설정에서 간단히 실행시킬 수 있습니다. 그래픽 버젼도 간단합니다. cudaprof 를 실행한 후 클릭만 하면 됩니다. 프로파일링은 중요한 단서들을 제공합니다. 프로파일 이벤트는 CUDA 하드웨어 장치 내에서 처리됩니다. 하지만 프로파일된 커널은 비동기적으로 실행할 수 없습니다. 통신 부하를 줄이기 위해서 커널이 종료된 이후 결과를 호스트로 전송합니다.

- 광역 메모리

숙련된 CUDA 프로그래머가 되려면 광역 메모리를 효과적으로 사용할 줄 알아야 합니다. 이제 소개할 내용은 reverseArray_multiblock.cu 와 reverseArray_multiblock_fast.cu 의 성능 차이를 이해하기에 충분한 광역 메모리에 대한 내용을 다룰 것입니다. 향후에도 필요에 따라 광역 메모리의 효율적인 사용에 대해 언급하겠습니다. 광역 메모리의 자세한 내용은 CUDA 프로그래밍 가이드 5.1.2.1 장을 참조하세요.

광역 메모리는 하드웨어가 데이터를 가장 적은 작업으로 페치(혹은 저장) 할 수 있는 반 워프 내로 합쳐서 억세스할 때 가장 메모리 밴드폭을 크게 사용할 수 있습니다. CUDA 계산 장치 (1.0 과 1.1) 는 데이터를 단일 64비트 혹은 128비트씩 페치할 수 있습니다. 만약 메모리 작업을 합칠 수 없다면, 메모리 작업이 각 쓰레드마다 반 워프씩 나뉘어지므로 비효율적입니다. 합쳐지지 않은 메모리 억세스로 보는 손해는 데이터 종류와 크기에 따라 달라집니다. CUDA 문서에서는 서로 다른 데이터 종류에 따라 예상되는 성능 저하를 대략 정리해 놓고 있습니다.

* 32 비트 데이터형은 10 배 정도 느리다
* 64 비트 데이터형은 4 배 정도 느리다
* 128 비트 데이터형은 2 배 정도 느리다

G80 아키텍쳐 내에서 모든 쓰레드가 반 워프 크기 블럭의 광역 메모리 억세스를 효율적으로 처리하려면:

1. 쓰레드는 32, 64, 128 비트 데이터형을 억세스한다.
2. 처리되는 모든 16워드 데이터는 동일한 메모리 처리 크기의 동일 세그먼트 내에 있다. (혹은 128비트 워드일 때 두 배의 메모리 처리 크기) 따라서 데이터 시작 주소와 배치가 중요하다.
3. 쓰레드는 워드 단위로 순차적으로 억세스한다. 반 워드 내의 k 번째 쓰레드는 k 번째 워드를 억세스한다. 그러나 모든 워프 내의 쓰레드가 합동 쓰레드 억세스로 메모리를 억세스할 필요는 없다. 이 경우 “분산 워프” 라고한다.

GT200 같은 새 아키텍쳐는 위에서 살펴본 합동 방식보다 쉽게 처리할 수 있습니다. 아키텍쳐별 차이점은 이후에 깊이 다루도록 하겠습니다. 지금은 간단히 말해 만약 G80 CUDA 장치에서 최적화된 코드는 GT200 에서도 충분히 동작한다고 정리할 수 있습니다.

- 텍스트 프로파일링 사용법

CUDA 프로파일러 텍스트 버젼을 위한 환경 변수들은

* CUDA_PROFILE: 프로파일러 enable = 1, disable = 0
* CUDA_PROFILE_LOG: 로그파일 이름 지정 (기본값은 ./cuda_profile.log)
* CUDA_PROFILE_CSV: Comma Separated Version 로그파일 enable = 1, disable = 0
* CUDA_PROFILE_CONFIG: 네 가지 신호에 대한 환경 설정을 저장하는 파일 지정

마지막 항목이 중요한데, 한 번에 네 가지 신호만을 프로파일링 할 수 있습니다. 개발자는 CUDA_PROFILE_CONFIG 에 지정된 파일에 기록하고자 하는 이벤트 이름을 한 줄씩 넣어둡니다.

* gld_incoherent: Number of non-coalesced global memory loads
* gld_coherent: Number of coalesced global memory loads
* gst_incoherent: Number of non-coalesced global memory stores
* gst_coherent: Number of coalesced global memory stores
* local_load: Number of local memory loads
* local_store: Number of local memory stores
* branch: Number of branch events taken by threads
* divergent_branch: Number of divergent branches within a warp
* instructions: instruction count
* warp_serialize: Number of threads in a warp that serialize based on address conflicts to shared or constant memory
* cta_launched: executed thread blocks

- 프로파일 카운터에 대하여

성능 카운터 값은 개별 쓰레드 활동에 관련이 없습니다. 그 대신 이 값은 쓰레드 워프 내의 이벤트를 의미합니다. 예를 들어 쓰레드 워프 내의 부조화한 데이터 저장은 gst_incoherent 값을 1 증가시킬 것입니다. 따라서 저장된 최종값은 모든 워프의 부조화한 데이터 저장 정보를 나타냅니다.

더불어, 프로파일러는 GPU 내의 멀티프로세서 중 한 개만을 포착합니다. 따라서 카운터 값은 특정 커널을 위해 실행된 워프의 총 개수와 무관합니다. 따라서 프로파일러 내의 퍼포먼스 카운터를 사용할 때에는 충분히 많은 쓰레드 블럭을 실행해서 멀티프로세서가 전체 작업에서 일관된 분량을 처리하게 하여야 합니다.

그러므로 카운터 값을 커널 코드를 검사하기 위한 값으로 사용할 수 없습니다. 카운터 값은 최적화된 코드와 그렇지 않은 코드의 상대평가로서 사용해야 합니다. 예를 들어, 소프트웨어 시작 단계에서 합동되지 않은 광역 메모리 읽기가 포착되었다면, 코드를 분석하여 합동되지 않은 메모리 억세스를 줄이는 방향으로 수정합니다. 대부분의 경우 목표는 합동되지 않은 글로벌 메모리 억세스를 0 으로 만드는 것이므로, 이 목표를 이루기 위해서 카운터 값을 유용하게 활용할 수 있습니다.

- 프로파일링 결과

프로파일러로 reverseArray_multiblock.cu 와 reverseArray_multiblock_fast.cu 를 살펴봅시다. 먼저 리눅스 bash 쉘 환경에서 환경 변수와 환경설정 파일을 다음과 같이 만듭니다.

export CUDA_PROFILE=1
export CUDA_PROFILE_CONFIG=$HOME/.cuda_profile_config

< Profiler configuration via environnent variables in Linux with bash >

gld_coherent
gld_incoherent
gst_coherent
gst_incoherent

< Contents of the CUDA_PROFILE_CONFIG file >

Running the reverseArray_multiblock.cu executable generates the following profiler report in ./cuda_profile.log:

reverseArray_multiblock.cu 를 실행해보면 프로파일러는 다음의 결과를 ./cuda_profile.log 로그파일에 기록합니다.

method,gputime,cputime,occupancy,gld_incoherent,gld_coherent,gst_incoherent,gst_coherent
method=[ memcopy ] gputime=[ 438.432 ]
method=[ _Z17reverseArrayBlockPiS_ ] gputime=[ 267.520 ] cputime=[ 297.000 ] occupancy=[ 1.000 ] gld_incoherent=[ 0 ] gld_coherent=[ 1952 ] gst_incoherent=[ 62464 ] gst_coherent=[ 0 ]
method=[ memcopy ] gputime=[ 349.344 ]

< Profile report for reverseArray_multiblock.cu >

동일한 방법으로 reverseArray_multiblock_fast.cu 를 실행하면 다음의 결과를 기존 파일 위에 덮어씁니다.

method,gputime,cputime,occupancy,gld_incoherent,gld_coherent,gst_incoherent,gst_coherent
method=[ memcopy ] gputime=[ 449.600 ]
method=[ _Z17reverseArrayBlockPiS_ ] gputime=[ 50.464 ] cputime=[ 108.000 ] occupancy=[ 1.000 ] gld_incoherent=[ 0 ] gld_coherent=[ 2032 ] gst_incoherent=[ 0 ] gst_coherent=[ 8128 ]
method=[ memcopy ] gputime=[ 509.984 ]

< Profile report for reverseArray_multiblock_fast.cu >

위의 두 프로파일러 결과를 비교해 보면 reverseArray_multiblock_fast.cu 는 비합동적 데이터 기록이 없었지만 reverseArray_multiblock.cu 에는 많이 발견되었습니다. reverseArray_multiblock.cu 소스코드를 살펴보시고 혹시 문제를 고칠 수 있는지 시도해보십시오. 고치고 난 다음 두 프로그램의 속도가 상대적으로 어떻게 바뀌었는지 측정해 보세요.

편의를 위해서 reverseArray_multiblock_cu 를 첫 번째에, reverseArray_multiblock_fast.cu 를 두 번째에 놓았습니다.

// includes, system
#include
#include

// Simple utility function to check for CUDA runtime errors
void checkCUDAError(const char* msg);

// Part3: implement the kernel
__global__ void reverseArrayBlock(int *d_out, int *d_in)
{
int inOffset = blockDim.x * blockIdx.x;
int outOffset = blockDim.x * (gridDim.x - 1 - blockIdx.x);
int in = inOffset + threadIdx.x;
int out = outOffset + (blockDim.x - 1 - threadIdx.x);
d_out[out] = d_in[in];
}

////////////////////////////////////////////////////////////////////////////////
// Program main
////////////////////////////////////////////////////////////////////////////////
int main( int argc, char** argv)
{
// pointer for host memory and size
int *h_a;
int dimA = 256 * 1024; // 256K elements (1MB total)

// pointer for device memory
int *d_b, *d_a;

// define grid and block size
int numThreadsPerBlock = 256;

// Part 1: compute number of blocks needed based on array size and desired block size
int numBlocks = dimA / numThreadsPerBlock;
// allocate host and device memory
size_t memSize = numBlocks * numThreadsPerBlock * sizeof(int);
h_a = (int *) malloc(memSize);
cudaMalloc( (void **) &d_a, memSize );
cudaMalloc( (void **) &d_b, memSize );

// Initialize input array on host
for (int i = 0; i < dimA; ++i)
{
h_a[i] = i;
}

// Copy host array to device array
cudaMemcpy( d_a, h_a, memSize, cudaMemcpyHostToDevice );

// launch kernel
dim3 dimGrid(numBlocks);
dim3 dimBlock(numThreadsPerBlock);
reverseArrayBlock<<< dimGrid, dimBlock >>>( d_b, d_a );

// block until the device has completed
cudaThreadSynchronize();

// check if kernel execution generated an error
// Check for any CUDA errors
checkCUDAError("kernel invocation");

// device to host copy
cudaMemcpy( h_a, d_b, memSize, cudaMemcpyDeviceToHost );

// Check for any CUDA errors
checkCUDAError("memcpy");

// verify the data returned to the host is correct
for (int i = 0; i < dimA; i++)
{
assert(h_a[i] == dimA - 1 - i );
}

// free device memory
cudaFree(d_a);
cudaFree(d_b);

// free host memory
free(h_a);

// If the program makes it this far, then the results are correct and
// there are no run-time errors. Good work!
printf("Correct!
");

return 0;
}
void checkCUDAError(const char *msg)
{
cudaError_t err = cudaGetLastError();
if( cudaSuccess != err)
{
fprintf(stderr, "Cuda error: %s: %s.
", msg, cudaGetErrorString( err) );
exit(EXIT_FAILURE);
}
}
< reverseArray_multiblock.cu >

// includes, system
#include
#include

// Simple utility function to check for CUDA runtime errors
void checkCUDAError(const char* msg);

// Part 2 of 2: implement the fast kernel using shared memory
__global__ void reverseArrayBlock(int *d_out, int *d_in)
{
extern __shared__ int s_data[];

int inOffset = blockDim.x * blockIdx.x;
int in = inOffset + threadIdx.x;

// Load one element per thread from device memory and store it
// *in reversed order* into temporary shared memory
s_data[blockDim.x - 1 - threadIdx.x] = d_in[in];

// Block until all threads in the block have written their data to shared mem
__syncthreads();

// write the data from shared memory in forward order,
// but to the reversed block offset as before

int outOffset = blockDim.x * (gridDim.x - 1 - blockIdx.x);

int out = outOffset + threadIdx.x;
d_out[out] = s_data[threadIdx.x];
}

////////////////////////////////////////////////////////////////////////////////
// Program main
////////////////////////////////////////////////////////////////////////////////
int main( int argc, char** argv)
{
// pointer for host memory and size
int *h_a;
int dimA = 256 * 1024; // 256K elements (1MB total)

// pointer for device memory
int *d_b, *d_a;

// define grid and block size
int numThreadsPerBlock = 256;

// Compute number of blocks needed based on array size and desired block size
int numBlocks = dimA / numThreadsPerBlock;

// Part 1 of 2: Compute the number of bytes of shared memory needed
// This is used in the kernel invocation below
int sharedMemSize = numThreadsPerBlock * sizeof(int);

// allocate host and device memory
size_t memSize = numBlocks * numThreadsPerBlock * sizeof(int);
h_a = (int *) malloc(memSize);
cudaMalloc( (void **) &d_a, memSize );
cudaMalloc( (void **) &d_b, memSize );

// Initialize input array on host
for (int i = 0; i < dimA; ++i)
{
h_a[i] = i;
}

// Copy host array to device array
cudaMemcpy( d_a, h_a, memSize, cudaMemcpyHostToDevice );

// launch kernel
dim3 dimGrid(numBlocks);
dim3 dimBlock(numThreadsPerBlock);
reverseArrayBlock<<< dimGrid, dimBlock, sharedMemSize >>>( d_b, d_a );

// block until the device has completed
cudaThreadSynchronize();

// check if kernel execution generated an error
// Check for any CUDA errors
checkCUDAError("kernel invocation");

// device to host copy
cudaMemcpy( h_a, d_b, memSize, cudaMemcpyDeviceToHost );

// Check for any CUDA errors
checkCUDAError("memcpy");

// verify the data returned to the host is correct
for (int i = 0; i < dimA; i++)
{
assert(h_a[i] == dimA - 1 - i );
}

// free device memory
cudaFree(d_a);
cudaFree(d_b);

// free host memory
free(h_a);

// If the program makes it this far, then the results are correct and
// there are no run-time errors. Good work!
printf("Correct!
");

return 0;
}

void checkCUDAError(const char *msg)
{
cudaError_t err = cudaGetLastError();
if( cudaSuccess != err)
{
fprintf(stderr, "Cuda error: %s: %s.
", msg, cudaGetErrorString( err) );
exit(EXIT_FAILURE);
}
}
< reverseArray_multiblock_fast.cu >
0 0
로그인 후 추천 또는 비추천하실 수 있습니다.
포인트 228,692
가입일 :
2003-02-18 14:12:30
서명 :
미입력
자기소개 :
미입력

최신글이 없습니다.

최신글이 없습니다.

댓글목록 0

등록된 댓글이 없습니다.
전체 529 건 - 4 페이지
2010.04
02

[App 개발] 맥 디바이스 드라이버

안녕하세요 오늘 맥 디바이스 드라이버에 대해 찾아보다가 이 사이트를 찾았네요 현재 맥 디바이스 드라이버를 공부 하는 중입니다. 간단하게 I/OKIT 로 PnP 나 레가시 드라이버 를 만들보려 합니다. 하지만 나중에 아이폰 드라이버를 만…

2010.03
18

[App 개발] 아이폰 GameKit 으로 파일 전송 하는 예제 보신 분 ??

안녕하세요~ 최근에 GameKit을 통해서 두 아이폰 사이에 파일 교환을 하려고 합니다. 그런데 예제들을 보면 단순 메세지 전달하는 정도만 있고, 파일을 전송하는 예제는 좀 처럼 찾아보기 어렵더군요. 파일 전송이나 메세지 전송이나…

2010.02
12

[App 개발] Memory Leak 관련된 질문입니다.

아이폰 개발을 하고있는데요 -(void) OnTimer { [self setNeedsDisplay]; } -(void)drawRect:(CGRect)rect { if(!image2) …

2009.12
14

[App 개발] xcode compile error

안녕하세요, xcode관련 질문이 있어서 글을 씁니다. 예전부터 써오던 맥G5(ppc, tiger)에서 코딩을 했었는데, 맥북(intel, snow leopard)에서 컴파일을 할려고 했더니 에러가 많이 뜨네요. ㅡㅡ; 프로세서의 특성…

2009.11
17

[App 개발] C로 작성된 모듈을 MAC에 포팅하려 합니다.

안녕하세요 제가 이번에 window, linux에서 돌리던 동영상 처리 모듈(C로 작성된)을 MAC에 포팅하는 일을 시작하게 되었는데요, UI, 오디오/비디오 입출력, 쓰레드 I/F등을 MAC 환경용으로 새로 구현하여 완성시키는 일이 되겠…

2009.11
01

[App 개발] OpenCV 2.0.0을 10.5.8에 설치중 에러를 만났습니다....

안녕하십니까 OpenCV라는 것을 한번 배워 보려고 OpenCV 2.0.0을 10.5.8에 설치중 에러를 만났습니다.... --> Q&A난으로 옮겼습니다. http://kmug.co.kr/board/zboard.phpid=macosxappq…

2009.10
22

[App 개발] GCD 예제

MacTech 10 월호에 게재된 GCD 예제를 번역하였습니다. 허락 없는 번역이므로 다른 곳에 퍼 가지 마세요. -_-; *** Grand Central Dispatch Grand Central Dispatch (GCD) 는 개발자들…

2009.09
24

[App 개발] OpenCL 프로그래밍 예제

개인 블로그에 차곡차곡 올리는 도중, 그래도 혹시나 쓸모가 있을 법한 아이를 하나 이곳에 분양하려 합니다. 아직 제 지식과 기술이 일천하여 완전히 최고 속도를 내지는 못하지만, 그래도 공부에는 도움이 될만한 소스가 아닐까 싶습니다. Bili…

2009.09
10

[App 개발] OpenCL 프로그래밍 도중 문제가 생기면...

2차원 Wavelet decomposition 루틴을 작성하기 위해 열심히 노력중에 있습니다. 아직 손에 익지 않은 기술이고, 예제가 많지 않은 기술이라, 매뉴얼 한 권에 의지하여 더듬더듬 나아가고 있습니다. 그런데 정말 신기한 현상을 보게 되었…

2009.08
27

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

- CUDA 와 라이브러리 사용 지난 회에서는 차세대 CUDA 하드웨어를 살펴보았습니다. 이번에는 하드웨어에서 소프트웨어로 주제를 약간 바꾸어서 CUDA 에서 라이브러리를 사용하는 것을 살펴보겠습니다. 최적화된 라이브러리는 응용프로그램의 성…

2009.08
26

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

- 차세대 CUDA 하드웨어 활용하기 6 장에서 CUDA 프로파일러를 이용하여 글로벌 메모리를 확인해 보았습니다. 이번에는 차세대 CUDA 하드웨어에 대해 살펴보려 합니다. CUDA 와 CUDA 지원 장치는 세대를 거듭할수록 더 향상된 성능…

2008.09
05

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

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

2008.07
29

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

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

2008.07
24

[App 개발] subclass NSObject 만드는 법아시는분.ㅜㅜ

코코아 개발 책보면서 공부하고있는 학생입니다. 현제 x-code 3.0사용하는데요 책에는 subclass NSObject 를 골라서 만들라고 하는데 mainmenu.nib항목에 책에는 file>edit>Classes요기에 만드는게 있는데 지금 쓰…

2008.07
22

[App 개발] Xcode3.1을 사용하는데요 .......

#include int main(void){ int val1,val2; coutval1; coutval2; int result = val1+va…

2008.03
30

[App 개발] xcode에서 c++ 컴파일 관련 질문입니다.

윈도에서 맥으로 바꾼지 얼마 안되는 컴퓨터공학과 학생입니다. 기존 윈도우에서 visual C++ 을 사용하다가 맥을 샀으니 맥으로 해보고 싶어서 검색하다 어찌어찌해서 xcode 설치하고 실행까지 해봤네요 그런데 사용상의 간…

2008.03
13

[App 개발] Xcode 컴파일후 실행하는 법

Xcode를 처음 다루는 사용자입니다. 코딩에도 초보 수준이고요. 터미널 프로그램을 만들고 있는데, 학교 과제로, 운도우 콘솔 프로그램 같은 Command Line 프로젝트로 작성하고 있습니다. 비주얼 스…

2008.01
04

[App 개발] Xcode에서 디버깅시....

보통 윈도환경의 비주얼C 에디터에서는 디버깅시 프로그램내의 변수값의 변화를 찾아 볼 수있느데요. xcode에서 디버깅시 어떻게 하면 변수값의 변화를 직접 찾아볼 수 있을까요

2007.10
15

[App 개발] xcode 3.0 에서 클래스 생성 방법이 어떻게 되나요?

cocoa관련 프로그래밍 책을 샀는데 예제를 따라할려구 해도 인터페이스 빌더가 너무 차이가 나니 예제를 따라서 할수가 없더군요. 아마 책은 2.4.1버젼을 기준으로 설명이 되어 있는듯 합니다. ㅠ.ㅠ HELP파일을 봐도 도통…

2007.09
10

[App 개발] OS X 하위버전과 호환되게 만들려면 어떻게 해야 되나요?

OS X 타이거 만이 아닌 팬더, 재규어 등 그 이전의 mac os 와 호환되게 빌드하려면 어떻게 해야 되나요 그냥 빌드만 하면 되는줄 알았는데 동성님이 10.3에서 실행이 안된다 하드라구요. [UB로도...]

2007.08
16

[App 개발] 텍스트 입력을 받는 NSTextField 에서요...

블록 선택이 안 되고 오직 키보드 입력만 되게 하도록 만들려면 어떻게 해야 되나요 isSelectable 메소드를 사용하면 아예 입력이 안 되고.... 그리고 키보드 입력을 받을 때마다 액션을 내게 하려면 어떻게 해야 되지요

2007.08
07

[App 개발] 자동으로 운영체제 키보드 레이아웃을 바꾸는 법에 관해서...

제가 제 개인적인 필요 때문에 타자 연습 프로그램을 만들고 있는데요. 프로그램에서 한글이나 영어 언어를 선택하고 연습 할 때 그 때마다 운영체제의 키보드 레이아웃도 한글이나 영어로 맞춰줘야 되서 불편한데요. 프로그램에서 언…

2007.07
29

[App 개발] Chapter 7의 8쪽에서의 질문....(Cocoa Programming for Mac OS X 2/E)

- (void)insertObject:(Person *)p inEmployeesAtIndex:(int)index { // Add the inverse of this operation to the undo stack NSUndo…

2007.07
16

[App 개발] helper object 에 관해서...

제가 코코아 책 보며 Helper Object 를 공부하는 중인데 아무리 생각해봐도 도무지 무엇인지 잘 이해가 되지 않습니다. 미숙한 번역실력 때문인듯.. 아무튼 제가 생각하는 helper object 는 클래스를 확장할 때 사용하는 객…

2007.07
01

[App 개발] Xcode 편집기에서 한글 입력할 때의 문제점에 대한 질문

안녕하세요. Xcode를 사용해서 ASCII 텍스트 형태의 소스 코드에 한글 주석을 입력하다 자꾸 특정 부분에서 아래와 같은 메시지 박스가 떠서 문자를 입력할 수가 없는데, 어떻게 하면 될지 그 해결 방법이 궁금합니다. 입력 문자열: 그…

2007.06
17

[App 개발] Cocoa 에 대한 질문..

코코아 책(정확히는 pdf...)을 열심히 보고 있는데.. 정확히 이해를 했는지 못했는지 몰라서.. 질문들을 올리겠습니다. 1. NSMutableArray *array; …

2007.06
06

[App 개발] 다시한번 질문.....

안녕하세요 아래 올렸던 내용과 비슷한데, 해결이 잘 안되서 다시 질문을 드립니다. 하드 디스크의 특정 디렉토리에서 파일의 유무를 검사해야 하는데요, 하드 디스크의 이름이 "ccc" 라면, open("ccc:어쩌구:파일", "r")…

2007.04
28

[App 개발] Dev C++에서 GLUT사용하는법을....

Visual Studio 쓰자니 다운하긴 좀 그렇고.. Express 는 아주 많이 부족하고... 그래서 Dev C++ 를 다운하려고 하는데요. 도대체 이걸로 GLUT프로그래밍 하는 법을 모르겠네요... 윈도우 어플로 GL 프로그래밍하는…

2007.01
27

[App 개발] OpenCV 1.0.0 Frameworks

wlee 님 뿐만 아니라 Mac 에서 이미지 프로세싱 관련 연구를 하시는 분들에게 유용한 툴이 될 듯 싶습니다. 좋은 라이브러리를 알게 되어 wlee 님께 감사말씀 드립니다. ^^ 물론 1.0.0 을 그대로 command-line 으로 컴파일해도…

2007.01
20

[App 개발] [질문] 외부 라이브러리 다시 한번 ~

질문 1. 외부 라이브러리를&nbsp;&nbsp;External Frameworks and libraries 폴더에 추가하기 위해, 오른쪽 버튼 -&gt; Add-&gt;existing files.. 를 선택해서…

2006.12
28

[App 개발] Xcode 에서 디버그 모드 ... 릴리즈 모드...

비주얼 스투디오에서는 빌드 아이콘 옆에 디버그 모드 릴리즈 모드 선택할 수 있어서 편했는데 Xcode 는 어떻게 하나요 오픈지엘 공부하면서 제가 만든 프로젝트들은 Build/Debug 디덱터리에 실행파일이 생기는데 책…

2006.12
22

[App 개발] [질문] XCODE에서 외부 라이브러리 가져다 쓸 때..

안녕하세요. 두 가지 질문을 하려고 합니다. 최근에 OpenGL 프로그래밍을 하고 있습니다. 쉐이더를 쓰려면 필요하다는 GLEW&nbsp;&nbsp;라이브러리를 AGL 로 빌드된 것을 다운 받아 헤더는 /usr/lo…

2006.10
09

[App 개발] 2.4로 업데이트 했는데도 여전히 깨지네요ㅠㅠ(사진첨부)

인코딩만 UTF-8로 하고 딴건 안했습니다. 프로젝트는 java->javatool로 했고요 이유를 모르겠네요 일단 업데이트형식으로 설치했는데 그래서 그럴까요

2006.10
09

[App 개발] Xcode 한글 깨짐 문제 (마스터님 봐주세요)

위와 같은 코딩을 하는데... 한글의 경우 깨져서 나오는데 프로젝트는 javatool로 했습니다. 환경과 파일인코딩 모두 UTF-8로 했습니다. 그래도 깨지던데... 어떻게 해결해야 하나요.. *ps: 스윙이나 웹 말고 일반적인 …

2006.08
27

[App 개발] OpenGL 질문....

1. 임플리먼테이션이 머죠 2. 소프트웨어와 하드웨어의 차이 3. 파이프라인이 무엇이죠 4. 파이프라인의 구조 부탁드립니다

2006.08
22

[App 개발] 마유라 는 한글이 잘 되는군요. ^^

InputStreamReader 의 속성을 SJIS 에서 EUC-KR 로 바꾸는 방법으로 미와 고스트는 안되는데 마유라 고스트는 잘 되는군요. 인텔 맥에서도 문제없이 돌아가고 있습니다. 영환님도 이미 컴파일 해보셨겠지만, 안되었으면 한 번 …

2006.01
03

[App 개발] Xcode 2.2 에서 C++ 프로그래밍 하기

아직 초보라서 잘 모르는데 어떻게 하는지 알려주세요... Project를 어떤 것을 선택해야하는지...

2005.12
19

[App 개발] Xcode 2.2 에서 카본 프로그램 만들자 (3)

이번에는 본격적으로 Quartz 의 Core Graphics 를 이용해서 그림을 그려 보겠습니다. 참고 자료로는 애플 홈페이지에서 다운로드 받으실 수 있는 Quartz 2D Programming Guide 입니다. 프로그램의 기본 구조는 이…

2005.12
17

[App 개발] Xcode 2.2 에서 카본 프로그램 만들자 (2)

윈도우 프로그래밍을 처음 공부한ㄴ 사람들이 한결같이 내놓는 불만은 "왜 이렇게 어렵냐" 라는 것입니다. 막말로, C 에서는 printf("Hello World\\n") ; 요거 하나만 하면 글을 볼 수 있는데, 윈도우에서는 글자 하나를 보…

2005.12
16

[App 개발] Xcode 2.2 에서 카본 프로그램 만들자 (1)

Xcode 새 버젼의 카본 어플리케이션 템플릿이 좀 더 친절해졌더군요. 한편, 지금까지 자기 고유의 이벤트 핸들러를 갖고 계시던 분들에게는 더 힘들어 졌더군요. ㅠㅠ 자 해 봅시다. 일단. Xcode 를 실행하고, File-&gt;N…

2005.08
15

[App 개발] XCode 2.1로 Maya plug-in 개발하기..?

Maya 6.0에서 제공하는 Maya API를 이용하여 plug-in을 개발하려고 help문서를 뒤져보니.. xcode는 예제의 프로젝트 파일을 컴파일해보라고 나와있는데.. xcode의 버전때문인지 컴파일이 되질 않는군요..-.- MSVC로 프로…

2005.02
10

[App 개발] hdf5설치 성공하신 분 있나요?

라이브러리 설치 문제가 계속 걸려서 fink 를 이용해 봤습니다만, 안되는군요. :-( libpng, libjpeg 등을 모두 설치해도 h5utils 를 configure 하는 도중에 이 라이브러리들이 없다고 하는군요. hdf5 역…

2004.10
13

[App 개발] X Code에서 include 포함 파일이나 라이브러리 파일의 경로는 어떻게 지정하나요 ?

안녕하세요.. 비주얼 스튜디오 같은 곳에서는 포함 파일이나 라이브러리 파일을 옵션에서 설정해 줄 수 있었습니다. X Code 에서는 이를 어떻게 설정해 주어야 하나요 예를 들어 /Volumes/Data/SDKLib 라는 곳에…

2004.01
10

[App 개발] 투명처리 어떻게 하나요?

분명 투명하게 처리해서 tiff포멧 한건데요, 흰 바탕이 그대로 나와버리네요. - (void)drawRect : (NSRect)rect { NSImage *imgFile = [NSImage imageNamed:@"JinPict"]; …

2009.08
25

[App 개발] OpenCL: democracy for GPU computing?

OpenCL: GPU 프로그램의 민주주의인가 by Damien Triolet March 19, 2009 OpenCL 개발 실무진이 꾸려진 지 6 개월 후 Khronos 라는 이름으로 출범하게 되었습니다. 아시는 것처럼 OpenCL (Open …

2009.08
22

[App 개발] Introductory Tutorial to OpenCL

Introductory Tutorial to OpenCL Skip Navigation LinksHome > GPU Tools > ATI Stream SDK > Introductory Tutorial to OpenCL Benedict R. Gas…

2009.08
21

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

- 광역 메모리와 CUDA 프로파일러 이번 6회에서는 메모리 성능과 reverseArray_multiblock_fast.cu 에서 공유 메모리를 사용하는 것을 살펴보겠습니다. 이번에는 CUDA 프로파일러를 이용하여 광역 메모리를 점검할 것입니다.…

2009.08
20

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

- 공유 메모리의 이해 (2) 지난 4회에서 실행 모델과 커널 실행 환경 설정이 레지스터의 갯수와 공유 메모리같은 지역 멀티프로세서 자원에 영향을 미치는지 살펴보았습니다. 이번에는 메모리 성능과 reverseArray_multiblock_fast…

2009.08
19

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

- 공유 메모리 사용법 CUDA 개발자에게 성능 향상의 관건은 공유 메모리, 상수 메모리, 레지스터 등의 프로세서 지역 메모리를 효율적으로 사용하는 것입니다. 앞 장에서 살펴본 것처럼, 전역 메모리 밴드폭이 60GB/s 라고 하지만, 실제 부동소…

2009.08
18

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

- 오류처리와 전역 메모리 성능 한계 축하합니다! CUDA 시리즈의 1편과 2편을 마치신 여러분은 CUDA 프로그래머가 되어서 이제 여러분은 CUDA 장치가 지원하는 수백 개의 병렬 쓰레드를 이용한 프로그램을 개발할 능력을 갖추셨습니다. 2편에 …