Programming/mmx & simd2012. 10. 12. 14:29
함수들 뒤지다 보니 MSDN 문서의 함수와 GCC의 함수들이 동일한것 발견.
도움이 될 듯 하니 일단 복사복사~

[링크 : http://msdn.microsoft.com/en-us/library/y0dh78ez(v=vs.80).aspx]



아무튼 요즘 신형 CPU들이야 SSE2를 넘어서 SSE3에 AVX(샌디부터)까지 지원하니
부동소수점 안되는 MMX를 할 필요도 없고
정수가 안되는 SSE를 쓸 필요도 없고
SSE2 이상 쓰세요~ 라는 기분의 비교표


[링크 : http://msdn.microsoft.com/en-US/library/esaffkes(v=vs.80).aspx



[링크 : http://msdn.microsoft.com/en-US/library/y08s279d(v=vs.80).aspx] 함수 이름 규칙


명령어를 비교해도 딱히 이게 SSE다 MMX다 라고 잘라말하기는 힘들다.
접미(suffix)를 보고 대충 짐작은 가지만 그렇다고 해서 확실한건 아니니..
[링크 : http://msdn.microsoft.com/en-us/library/ccky3awe(v=vs.80).aspx ] MMX 명령어
[링크 : http://msdn.microsoft.com/en-us/library/t467de55(v=vs.80).aspx] SSE 명령어

'Programming > mmx & simd' 카테고리의 다른 글

sse / mmx 확장  (0) 2012.10.09
Posted by 구차니
Programming/mmx & simd2012. 10. 9. 11:08
openMP / CUDA 책을 보다보니 MMX 확장명령을 많이 쓰길래
어떤 컴파일러에서 어떤 변수 타입으로 지원하나 조사..

[링크 : http://stackoverflow.com/questions/661338/sse-sse2-and-sse3-for-gnu-c]
  [링크 : http://software.intel.com/sites/default/files/m/9/4/c/8/e/18072-347603.pdf
  [링크 : http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html
[링크 : http://gcc.gnu.org/onlinedocs/gcc-4.0.4/gcc/i386-and-x86_002d64-Options.html]
[링크 : http://gcc.gnu.org/onlinedocs/gcc-3.1/gcc/X86-Built-in-Functions.html]
[링크 : http://www.cs.fsu.edu/~xyuan/cis4930-cda5125/lect4_simd_sse.pptx]

---
ubuntu 10.04 LTS gcc의 경우
/usr/lib/gcc/i486-linux-gnu/4.x/include 경로에 ?mmintrin.h 라는 파일명으로 헤더가 존재한다.
(/usr/lib/gcc/i486-linux-gnu/4.6/include 우분투 12.04 에서는 4.6으로 나옴)
gcc 컴파일시 --mmmx -msse 등의 옵션을 주어야 하는듯 하다.

변수명은 intel 문서에서 처럼 __m64 도 지원하지만
__v2si__
__v4hi__
__v8qi__
__v2sf__ 등의 변수명을 지원하기도 한다.

/* The Intel API is flexible enough that we must allow aliasing with other
   vector types, and their scalar components.  */
typedef int __m64 __attribute__ ((__vector_size__ (8), __may_alias__));

/* Internal data types for implementing the intrinsics.  */
typedef int __v2si __attribute__ ((__vector_size__ (8)));
typedef short __v4hi __attribute__ ((__vector_size__ (8)));
typedef char __v8qi __attribute__ ((__vector_size__ (8)));
typedef long long __v1di __attribute__ ((__vector_size__ (8)));
typedef float __v2sf __attribute__ ((__vector_size__ (8)));

---
$ cat temp.c
#include <stdio.h>
#include <mmintrin.h>

void main()
{
        __m64 m64val;
} 

$ gcc temp.c
In file included from temp.c:2:
/usr/lib/gcc/i486-linux-gnu/4.4.3/include/mmintrin.h:32:3: error: #error "MMX instruction set not enabled"
temp.c: In function ‘main’:
temp.c:6: error: ‘__m64’ undeclared (first use in this function)
temp.c:6: error: (Each undeclared identifier is reported only once
temp.c:6: error: for each function it appears in.)
temp.c:6: error: expected ‘;’ before ‘m64val’
 
$ gcc -mmmx temp.c 

'Programming > mmx & simd' 카테고리의 다른 글

mmx, sse intrinsics from MSDN.NET  (0) 2012.10.12
Posted by 구차니
Programming/openCL & CUDA2012. 9. 20. 21:58
CUDA 책을 읽다가 결합법칙에서 계속 막혔었는데..
생각을 해보니 "공유 메모리"는 일정 갯수의 쓰레드 끼리만 공용으로 사용한다라는 사실을 잊고 있었던것...
다르게 보면, 공유 메모리로 복사할때는 4byte(int)형으로만 복사하면
상위레벨에서 블럭으로 system memory에서 블럭단위로 전송하여
쓰레드 블럭에서 알아서 분배하는 스타일로 복사하는 것이다.

그런 이유로, 공유 메모리 예제에서는
for문으로 왕창 복사하는게 아니라 __shared__로 정의된 배열중 하나의 값만 복사를 해서 넣는것 -_-



다르게 말하면 성능 저하를 감수하고
공유 메모리를 사용하지 않는다면 굳이 결합법칙에 머리 아플 이유도 없다는게 되려나? 

---
2012.9.22
다시보니 공유 메모리로가 아니라
로컬 메모리에서 로딩하는 모든 연산에 대한 문제이다.
cuda의 특성상 로컬 메모리(오프칩/저속) 에서 읽어오때 블럭단위로 전송을 하기에
단순하게 로컬 메모리에서 읽어 로컬메모리에 쓸때에도
로컬 메모리에서 읽는 부분의 성능 저하를 최소화 하기 위해
결합법칙을 지켜주는 것이 좋다.
 

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

cuda deviceQuery on GTX650  (0) 2013.02.17
cuda 5.0  (0) 2013.02.16
cudaMalloc 시작 위치?  (0) 2012.07.11
cudemMemcpy()  (0) 2012.06.07
cuda 에서 device memory의 용량을 초과하는 malloc은 위험해!  (0) 2012.06.06
Posted by 구차니
Programming/openCL & CUDA2012. 7. 11. 22:48
그냥 실험적으로 해보니

0x0021 0000 에서 부터 시작한다.
0x0000 0000 을 cudaMemcpy로 복사해오니 전부 0 인거 같은데..
번지가 잘못되서 그러려나?


아무래도 비디오 메모리 안에 프레임 버퍼와 텍스쳐 메모리 등으로 나뉘는거 같긴한데..
텍스텨 메모리로 할당된 녀석만 cudaMalloc / cudaMemcpy 등으로 접근 가능한건 아니겠지? 

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

cuda 5.0  (0) 2013.02.16
cuda shared memory의 결합법칙?  (0) 2012.09.20
cudemMemcpy()  (0) 2012.06.07
cuda 에서 device memory의 용량을 초과하는 malloc은 위험해!  (0) 2012.06.06
nvcc 는 int main()을 좋아해  (0) 2012.06.05
Posted by 구차니
Programming/C Win32 MFC2012. 7. 2. 22:11
limits.h 와 float.h 두개에서 변수의 범위에 대한 define을 포함한다.

[링크 :  http://publications.gbdirect.co.uk/c_book/chapter9/limits.html ]
Posted by 구차니
Programming/openMP2012. 6. 18. 23:17
libgomp 공식 문서 보다는, osc.eud의 문서가 보기 쉽고 정리가 잘 된듯한 느낌.

[링크 : http://www.osc.edu/supercomputing/training/openmp/openmp_0311.pdf]
[링크 : http://gcc.gnu.org/onlinedocs/libgomp.pdf
Posted by 구차니
Programming/openMP2012. 6. 18. 23:00
2C4T 시스템이니 4의 배수로 한번 테스트

parallel for를 통해서 자동으로 나누어 주도록 하면 되는데,
결과를 보면 순서가 틀어져서 나온다. (나누어 실행하되 누가 먼저 실행될진 모르니)
$ cat test.c
#include <stdio.h>
#include <omp.h>

int main(int argc, const char *argv[])
{
    int idx = 0;
    #pragma omp parallel for
    for(idx = 0; idx < 16; idx++)
         printf("%d\n",idx);

    return 0;
} 

$ ./a.out
0
1
2
3
12
13
14
15
4
5
6
7
8
9
10
11 

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

TBB - Threading Building Blocks by intel  (0) 2013.01.08
openMP 문서들  (0) 2012.06.18
libgomp 공식 사이트 / 문서  (0) 2012.06.10
우분투에서 openMP 예제  (0) 2012.06.09
openMP / gcc -fopenmp  (0) 2012.06.09
Posted by 구차니
Programming/C Win32 MFC2012. 6. 14. 22:59
엔디안은 "메모리에 저장되는" 바이트의 순서를 의미한다.
"메모리에" 라는것이 매우 중요한데

HDD와 같은 녀석은 bit stream 처럼 어떻게 보면 big endian 처럼 저장되며
cpu 레지스터에서도 일단~은 big endian 처럼 보인다.

유일(?)하게 영향을 받는게
메모리에서 내용을 받아와 다른 형(type)으로 변환하는 경우인데
어셈블리 언어로 이야기 하자면 mem to register 명령에 영향을 미친다고 하면 되려나?

아무튼 프로그래밍을 5년 넘게 현업으로 하고 있지만
정말 제대로 엔디안을 아는게 아닌게 아니었구나 라는 생각이 문든 드는 화두..
"비트 쉬프트 할 경우 정말 실제로는 어떻게 작동할 것인가?"
요 녀석에 멘붕을 느끼는중

[링크 : http://www.terms.co.kr/big-endian.htm ]
[링크 : http://ko.wikipedia.org/wiki/엔디언 ]

[링크 : http://www.ibm.com/developerworks/kr/library/au-endianc/index.html ] 
Posted by 구차니
Programming/C Win32 MFC2012. 6. 12. 14:14
부제 : 아오 미네랄 써글넘의 localtime()

localtime() 함수는 struct tm * 형을 리턴하는데
다르게 말하면, glibc나 library 내의 변수의 포인터를 리턴하는 식이 되는지라 매번 할당해서 돌려주는게 아니라는 의미.
즉, 연속으로 localtime을 사용해서 포인터로 받는다면, 당연히 동일 주소 동일 내용이 되므로
조건식 비교에서 항상 참이 될 수 밖에 없다 -_-

struct tm *localtime(const time_t *timep);
struct tm *localtime_r(const time_t *timep, struct tm *result);

POSIX.1-2001 says: "The asctime(), ctime(), gmtime(), and localtime() functions shall return values in one of two static objects: a broken-down time structure and an array of type char. Execution of any of the functions may overwrite the information returned in either of these objects by any of the other functions." This can occur in the glibc implementation.

[링크 : http://linux.die.net/man/3/localtime ]   


그런 이유로 아래와 같이 복사하거나, 처음부터 포인터가 아닌 값으로 받아 변수에 넣도록 해주는 것도 방법인데
오홍.. 아래 방법은 당연한 문법이지만 왜이리 생소해 보일까? ㅋㅋ

struct tm stTempTime;
pstCurTime = localtime(&lCurTime);
memcpy(&stTempTime, pstCurTime, sizeof(struct tm));

는 간단하게
struct tm stTempTime = *localtime(&lCurTime);

[링크 : http://kldp.org/node/71959 ]  

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

c 변수범위 헤더  (0) 2012.07.02
엔디안 / endian  (2) 2012.06.14
C언에 이스케이프 문자를 이용한 특수문자 출력하기  (0) 2012.03.28
함수 포인터 배열  (0) 2012.03.07
헐 # include 이게 되는거였다니!  (0) 2012.02.15
Posted by 구차니
Programming/openMP2012. 6. 10. 20:08
openMP의 GNU 구현 버전인 libgomp(Gnu OpenMP)

[링크 : http://gcc.gnu.org/onlinedocs/libgomp/]
[링크 : http://gcc.gnu.org/onlinedocs/libgomp.pdf]

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

openMP 문서들  (0) 2012.06.18
openmp for문 나누기  (0) 2012.06.18
우분투에서 openMP 예제  (0) 2012.06.09
openMP / gcc -fopenmp  (0) 2012.06.09
openMP  (0) 2011.02.05
Posted by 구차니