개소리 왈왈/자전거2012. 5. 19. 14:03
성남공단 내리막길에 2단/5단 놓고 달성 -_-b
그나저나.. 아직 다리힘이 한계인지 50킬로도 안되네 ㅠㅠ
이제 헬멧사야겠다 ㅠㅠ

+ 최고속도
- 때릉이

'개소리 왈왈 > 자전거' 카테고리의 다른 글

BB가 고장난게 아니라~  (0) 2012.06.09
야간에 자전거!  (2) 2012.05.25
간만에 자전거  (4) 2012.05.12
오랫만에 자전거 나들이  (4) 2012.03.17
자전거 핸들 스템  (1) 2011.12.21
Posted by 구차니
Programming/openCL & CUDA2012. 5. 18. 21:22
CUDA device에서 제공하는 메모리의 종류는 다음과 같다.

5.3.2  Device Memory Accesses .................................................................... 70 
    5.3.2.1  Global Memory ............................................................................ 70 
    5.3.2.2  Local Memory .............................................................................. 72 
    5.3.2.3  Shared Memory ........................................................................... 72 
    5.3.2.4  Constant Memory ........................................................................ 73 
     5.3.2.5  Texture and Surface Memory ........................................................ 73  

[출처 :  CUDA C Programming guide.pdf] 

Local memory 와 Global memory는 그래픽 카드의 비디오 메모리(통상 512MB / 1기가 이런식으로 말하는)에 존재하고
Shared memory는 GPU 내의 Multi-Processor에 통합되어있다.

Devicequery를 비교하면서 보자면
8800GT 512MB 짜리에서
Global memory와 Local memory는 512MB 까지 가능하며
Shared memory는 블럭당 16KB 까지 가능하다.

 Device 0: "GeForce 8800 GT"
  CUDA Driver Version:                           3.20
  CUDA Runtime Version:                          3.10
  CUDA Capability Major revision number:         1
  CUDA Capability Minor revision number:         1
  Total amount of global memory:                 536543232 bytes
  Number of multiprocessors:                     14
  Number of cores:                               112
  Total amount of constant memory:               65536 bytes
  Total amount of shared memory per block:       16384 bytes
  Total number of registers available per block: 8192
  Warp size:                                     32
  Maximum number of threads per block:           512
  Maximum sizes of each dimension of a block:    512 x 512 x 64
  Maximum sizes of each dimension of a grid:     65535 x 65535 x 1   

2011/01/02 - [Programming/openCL / CUDA] - deviceQuery on 8600GT 512MB + CUDA 하드웨어 구조
      
 

예제로 들어있는 행렬곱 예제에서
shared memory를 사용하고 사용하지 않는 차이점은 아래의 그림처럼
Global memory에 직접 한 바이트씩 읽어서 계산하는지

아니면 global memory의 블럭을
shared memory로 일정 영역만(블럭 사이즈 만큼) 복사해서 계산을 하는지의 차이점이 있다.

다른 책에 의하면 global memory는 700~900 cuda clock에 읽어오고
shared memory는 거의 1 cuda clock에 읽어 온다고 하니
되도록이면 shared memory에 복사해서 더욱 빠르게 연산하는게 유리하다고 한다.

 

 

// Matrices are stored in row-major order: 
// M(row, col) = *(M.elements + row * M.width + col) 
typedef struct { 
    int width; 
    int height; 
    float* elements; 
} Matrix; 
 
// Thread block size 
#define BLOCK_SIZE 16 
 
// Forward declaration of the matrix multiplication kernel 
__global__ void MatMulKernel(const Matrix, const Matrix, Matrix); 
 


























 
// Matrix multiplication - Host code 
// Matrix dimensions are assumed to be multiples of BLOCK_SIZE 
void MatMul(const Matrix A, const Matrix B, Matrix C) 
    // Load A and B to device memory 
    Matrix d_A; 
    d_A.width = A.width; d_A.height = A.height; 
    size_t size = A.width * A.height * sizeof(float); 
    cudaMalloc(&d_A.elements, size); 
    cudaMemcpy(d_A.elements, A.elements, size, 
               cudaMemcpyHostToDevice); 
    Matrix d_B; 
    d_B.width = B.width; d_B.height = B.height; 
    size = B.width * B.height * sizeof(float); 
    cudaMalloc(&d_B.elements, size); 
    cudaMemcpy(d_B.elements, B.elements, size, 
               cudaMemcpyHostToDevice); 
 
    // Allocate C in device memory 
    Matrix d_C; 
    d_C.width = C.width; d_C.height = C.height; 
    size = C.width * C.height * sizeof(float); 
    cudaMalloc(&d_C.elements, size); 
 
    // Invoke kernel 
    dim3 dimBlock(BLOCK_SIZE, BLOCK_SIZE); 
    dim3 dimGrid(B.width / dimBlock.x, A.height / dimBlock.y); 
    MatMulKernel<<<dimGrid, dimBlock>>>(d_A, d_B, d_C); 
 
    // Read C from device memory 
    cudaMemcpy(C.elements, Cd.elements, size, 
               cudaMemcpyDeviceToHost); 
 
    // Free device memory 
    cudaFree(d_A.elements); 
    cudaFree(d_B.elements); 
    cudaFree(d_C.elements); 

// Matrix multiplication kernel called by MatMul() 
__global__ void MatMulKernel(Matrix A, Matrix B, Matrix C) 
    // Each thread computes one element of C 
    // by accumulating results into Cvalue 
    float Cvalue = 0; 
    int row = blockIdx.y * blockDim.y + threadIdx.y; 
    int col = blockIdx.x * blockDim.x + threadIdx.x; 
    for (int e = 0; e < A.width; ++e) 
        Cvalue += A.elements[row * A.width + e] 
                * B.elements[e * B.width + col]; 
    C.elements[row * C.width + col] = Cvalue; 













































 

// Matrices are stored in row-major order: 
// M(row, col) = *(M.elements + row * M.stride + col) 
typedef struct { 
    int width; 
    int height; 
    int stride;  
    float* elements; 
} Matrix; 
 
// Get a matrix element 
__device__ float GetElement(const Matrix A, int row, int col) 
    return A.elements[row * A.stride + col]; 
 
// Set a matrix element 
__device__ void SetElement(Matrix A, int row, int col, 
                           float value) 
    A.elements[row * A.stride + col] = value; 
 
// Get the BLOCK_SIZExBLOCK_SIZE sub-matrix Asub of A that is 
// located col sub-matrices to the right and row sub-matrices down 
// from the upper-left corner of A 
__device__ Matrix GetSubMatrix(Matrix A, int row, int col)  
    Matrix Asub; 
    Asub.width    = BLOCK_SIZE; 
    Asub.height   = BLOCK_SIZE; 
    Asub.stride   = A.stride; 
    Asub.elements = &A.elements[A.stride * BLOCK_SIZE * row 
                                         + BLOCK_SIZE * col]; 
    return Asub; 
 
// Thread block size 
#define BLOCK_SIZE 16 
 
// Forward declaration of the matrix multiplication kernel 
__global__ void MatMulKernel(const Matrix, const Matrix, Matrix); 
 
// Matrix multiplication - Host code 
// Matrix dimensions are assumed to be multiples of BLOCK_SIZE 
void MatMul(const Matrix A, const Matrix B, Matrix C) 
    // Load A and B to device memory 
    Matrix d_A; 
    d_A.width = d_A.stride = A.width; d_A.height = A.height; 
    size_t size = A.width * A.height * sizeof(float); 
    cudaMalloc(&d_A.elements, size); 
    cudaMemcpy(d_A.elements, A.elements, size, 
               cudaMemcpyHostToDevice); 
    Matrix d_B; 
    d_B.width = d_B.stride = B.width; d_B.height = B.height; 
    size = B.width * B.height * sizeof(float); 
    cudaMalloc(&d_B.elements, size); 
    cudaMemcpy(d_B.elements, B.elements, size, 
               cudaMemcpyHostToDevice); 
 
    // Allocate C in device memory 
    Matrix d_C; 
    d_C.width = d_C.stride = C.width; d_C.height = C.height; 
    size = C.width * C.height * sizeof(float); 
    cudaMalloc(&d_C.elements, size); 
 
    // Invoke kernel 
    dim3 dimBlock(BLOCK_SIZE, BLOCK_SIZE); 
    dim3 dimGrid(B.width / dimBlock.x, A.height / dimBlock.y); 
    MatMulKernel<<<dimGrid, dimBlock>>>(d_A, d_B, d_C); 
 
    // Read C from device memory 
    cudaMemcpy(C.elements, d_C.elements, size, 
               cudaMemcpyDeviceToHost); 
 
    // Free device memory 
    cudaFree(d_A.elements); 
    cudaFree(d_B.elements); 
    cudaFree(d_C.elements); 
 
// Matrix multiplication kernel called by MatMul() 
__global__ void MatMulKernel(Matrix A, Matrix B, Matrix C) 
    // Block row and column 
    int blockRow = blockIdx.y; 
    int blockCol = blockIdx.x; 
 
    // Each thread block computes one sub-matrix Csub of C 
    Matrix Csub = GetSubMatrix(C, blockRow, blockCol); 
     // Each thread computes one element of Csub 
    // by accumulating results into Cvalue 
    float Cvalue = 0; 
 
    // Thread row and column within Csub 
    int row = threadIdx.y; 
    int col = threadIdx.x; 
 
    // Loop over all the sub-matrices of A and B that are 
    // required to compute Csub 
    // Multiply each pair of sub-matrices together 
    // and accumulate the results 
    for (int m = 0; m < (A.width / BLOCK_SIZE); ++m) { 
 
        // Get sub-matrix Asub of A 
        Matrix Asub = GetSubMatrix(A, blockRow, m); 
 
        // Get sub-matrix Bsub of B 
        Matrix Bsub = GetSubMatrix(B, m, blockCol); 
 
        // Shared memory used to store Asub and Bsub respectively 
        __shared__ float As[BLOCK_SIZE][BLOCK_SIZE]; 
        __shared__ float Bs[BLOCK_SIZE][BLOCK_SIZE]; 
 
        // Load Asub and Bsub from device memory to shared memory 
        // Each thread loads one element of each sub-matrix 
        As[row][col] = GetElement(Asub, row, col); 
        Bs[row][col] = GetElement(Bsub, row, col); 
 
        // Synchronize to make sure the sub-matrices are loaded 
        // before starting the computation 
        __syncthreads(); 
 
        // Multiply Asub and Bsub together 
        for (int e = 0; e < BLOCK_SIZE; ++e) 
            Cvalue += As[row][e] * Bs[e][col]; 
 
        // Synchronize to make sure that the preceding 
        // computation is done before loading two new 
        // sub-matrices of A and B in the next iteration 
        __syncthreads(); 
    } 
 
    // Write Csub to device memory 
    // Each thread writes one element 
    SetElement(Csub, row, col, Cvalue); 
}


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

cuda 5 preview  (0) 2012.06.02
nvidia ion cuda core와 h.264 library  (0) 2012.05.22
Interoperability (상호운용성)  (0) 2012.05.04
cuda 내장변수  (0) 2012.04.30
kernel block 과 thread  (0) 2012.04.26
Posted by 구차니
5달만에 복귀한 코스피 지수.
펀드 들어놓은걸 손실 감수하고 지금이라도 빼야하나 일단 그냥 계속 묵혀둘까 고민고민..



솔찍히.. 증권가의 가장 큰 문제는
증권 얼마간다! 얼마선은 무너지지 않는다! 수익률은 얼마이다! 이러지만
실제로 보면 투자자는 이래저래 절대 큰 이익을 얻을수 없고
수수료라던가 자잘하게 뜯어가면서 증권사가 대행인만 돈버는 구조라고 해야하나.

그러면서도 그 사람들은 세계증시가 어쩌구 하면서 자신의 책임은 하나도 지지않는 다는점.
펀드매니저도 힘들고 밤새고 수명도 짧다지만, 그것과 책임은 별개아 아닐까?
머.. 다르게 말해서 책임도 주어진다면 이런 위험을 무릎쓰고 무리하게 공격적으로(?) 투자하는
투자자들도 사라지고 허언을 남발하는 예언가들도 사라질꺼고 너무 조용한 세상이 되려나... 
Posted by 구차니
4년 연속 불참에 개회사 생략이라니
부디 대선에 원하는 결과가 나오길 빌어본다.. 시발 -_-t

[링크 : http://media.daum.net/politics/newsview?newsid=20120518081010857
[링크 : http://ko.wikipedia.org/wiki/5.18]
Posted by 구차니
경기버스 타고 가야하나 -ㅁ-?
그래도 솔찍히 9.5% 인상은 좀 너무 하는 느낌인데 -_-
차라리 인력을 더 뽑아달라구 하지 ㅠ.ㅠ

[링크 :  http://media.daum.net/society/others/newsview?newsid=20120517035604880&cateid=1067&RIGHT_COMM=R3]

'개소리 왈왈 > 직딩의 비애' 카테고리의 다른 글

프로그램에서 제일 중요한 것  (0) 2012.05.24
D-103  (0) 2012.05.23
아이고 내 펀드 ㅠ.ㅠ  (2) 2012.05.11
길빵을 왜케 많이해?  (2) 2012.05.09
와이파이 안터져요 ㅠ.ㅠ  (0) 2012.05.04
Posted by 구차니
교과서에서 진화론을 빼달라고 기독교에서 요청을 했다는데
머.. 이단이라고 하면 빠져나갈수 있는 참으로 간편한 논리를 또 쓰려나?

[링크 :  http://media.daum.net/society/newsview?newsid=20120517032635618]
Posted by 구차니
귀찮아서 SDK starter package만 설치하고
가상머신 버전 대충 하나 골라서 추가해주고 나니
java sdk 없이 win7 내장 java vm으로도 작동이 문제없이 되는데...


역시.. 2.3.3 만으로는.. setting도 없고 아무것도 없어서 되는게 아니구나 ㅠ.ㅠ

[링크 : http://developer.android.com/sdk/index.html]
Posted by 구차니
아부지꺼가 되어버린 아이패드2 -_-
어머니도 카톡만 가입되어 있어서
친척들이 애기사진 보고 싶다고 협박당하신다는데 -_-

아무튼 그래서 한번 시도는 해봐야지 머.. 에효오~
거실에 pc놔두길 잘한걸려나?
--
너무 높은 버전을 시도해서 그런가? 켜지지도 않네 ㅠ.ㅠ

[링크 : http://www.android-x86.org/download]
    [링크 : http://www.android-x86.org/documents/installhowto]
[링크 : https://www.virtualbox.org/wiki/Downloads
Posted by 구차니
개소리 왈왈2012. 5. 15. 08:46
으헝헝 애용하던 메모짱 서비스가 종료되다니 ㅠ.ㅠ
네이트 나빠요 ㅠ.ㅠ


Posted by 구차니
개소리 왈왈/블로그2012. 5. 14. 22:24
위키에 강좌를 정리중인데..
블로그에 새로운 무언가가 추가되지 않으니
웬지모르게 정체되거나 뒷걸음이라는 기분마저 드는건 왜일까.. 

방문자수 때문에 괜히 마음이 그런걸려나? 

'개소리 왈왈 > 블로그' 카테고리의 다른 글

내 블로그에 무슨일이?  (0) 2012.06.09
달라진 스팸패턴  (0) 2012.05.27
어찌되었건 도메인 기관이전 완료  (0) 2012.05.10
도메인 이전 힘들어~  (0) 2012.05.10
도메인 이전시 주의사항  (2) 2012.05.08
Posted by 구차니