CUDA Driver API나 Runtime API는 원칙적으로 하나의 GPU를 사용하여
하나의 GPU내의 멀티쓰레드를 사용하도록 설계되어 있다. 이러한 제어의 관리를 컨텍스트 라고 지칭해도 될 지 모르겠지만
이러한 기본 컨텍스트는 1번 GPU를 사용하도록 되어있고,
Runtime API 쪽에서는 cudaSetDevice (int device) 라는 함수로 특정 GPU를 사용하도록 제한할 수 있다.
하지만 Driver API에는 이러한 함수가 존재하지 않으므로
직접 Handle을 이용하여 openMP 나 thread 등을 이용하여 직접 여러개의 CPU 쓰레드를 이용하여
GPU를 여러개 동시에 가동시키는 방법을 사용하는 것으로 보여진다.
8.2 Multi-GPU Programming |
CUDA Toolkit SDK의 예제는 threadMigration를 참조하면 될 듯
/******************************************************************************
*
* Module: threadMigration.cpp
*
* Description:
* Simple sample demonstrating multi-GPU/multithread functionality using
* the CUDA Context Management API. This API allows the a CUDA context to be
* associated with a CPU process. CUDA Contexts have a one-to-one correspondence
* with host threads. A host thread may have only one device context current
* at a time.
*
* Refer to the CUDA programming guide 4.5.3.3 on Context Management
*
******************************************************************************/
|
MonteCarloMultiGPU 예제에도 cutil 을 이용한 예제가 존재하는 것으로 보인다.
//Start CPU thread for each GPU
for(gpuIndex = 0; gpuIndex < GPU_N; gpuIndex++)
threadID[gpuIndex] = cutStartThread((CUT_THREADROUTINE)solverThread, &optionSolver[gpuIndex]);
printf("main(): waiting for GPU results...\n");
cutWaitForThreads(threadID, GPU_N);
|
cutStartThread는 multithreading.h 에 포함되어 있는 녀석이다.
#if _WIN32
//Create thread
CUTThread cutStartThread(CUT_THREADROUTINE func, void *data){
return CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)func, data, 0, NULL);
}
#endif
|
'Programming > openCL & CUDA' 카테고리의 다른 글
CUDA processor roadmap / CUDA SDK 4.0 (1) | 2011.07.03 |
---|---|
CUDA 4.0 RC (4) | 2011.03.02 |
CUDA driver API / runtime API (0) | 2011.01.26 |
SLI에 대한 CUDA의 제한(과거에는 그랬다더라~) (0) | 2011.01.26 |
cuBLAS / BLAS Level 1,2,3 (0) | 2011.01.24 |