글 목록 보기

Lyn
조회 수 4303 추천 수 0 댓글 0
Atachment
첨부 '3'
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

상당히 많은 언어가 예외 처리기를 가지고 있는데, 각각의 언어별로 특성이 있습니다.
try - catch - finally 를 모두 가지고 있는 언어(C#, Java 등) 도 있고

try - except (C 계열의 try - catch 에 대응) 와 try - finally 를 가지고 있지만 try - except 뒤에 finally 가 붙을 수 없어서 아래와 같이 중첩을 해야 하는 Pascal 계열의 언어(주로 Delphi 겠지만..) 도 있습니다


try

  try 

    //do something

  except

    //do something

finally

  //do something 


네 그리고 대망의 C++은.. finally 그런거 없습니다 (...)
C++ 표준협회에서는 stack 에 생성된 객체의 소멸자를 이용하라고 하는데 다른 언어의 코드를 C++로 옮기다가 보면 해제할것 하나하나마다 객체 만들어 주기도 보통 일이 아닙니다. 하지만 의외로 타 언어의 샘플을 C++로 옮기는게 자주 발생 하는 일이기도 하지요.


그래서 전 람다를 이용한 꼼수를 이용해서 코드를 옮길때 자주 써먹고 있습니다.
바로 아래와 같은 객체를 사용 해서요


class Finalizer
{
public:
    Finalizer()
    {

    }
    Finalizer(std::function<void(void)> fPtr)
    {
        this->fPtr = fPtr;
    }
    ~Finalizer()
    {
        if (fPtr != nullptr) fPtr();
    }
    void SetFunction(std::function<void(void)> fPtr)
    {
        this->fPtr = fPtr;
    }
private:    
    std::function<void(void)> fPtr;
};


소멸자에서 function 을 호출해 주느 매우 단순한 구조입니다.
이걸 어떻게 쓰냐면 


void test1()
{
    char* arr = new char[100];
    Finalizer final([&]
    {
        delete[] arr;
        wcout << L"Test1 : Delete Arr" << endl;
    });

    //do Something
    wcout << L"Test1 Code End" << endl;
    
    return;
}


이렇게 씁니다.

저 Finalizer 의 생성자로 lambda 를 넘겨서 finally 블록으로 삼는거죠.
그럼 포커스를 잃는순간 호출 되면서 실행 되게 됩니다.

final1.png


그럼 exception 이 발생 했을때는 어떨까요?
간단하게 아래와 같은 코드를 생각해 볼 수 있습니다


void test2()
{
    try
    {
        char* arr = new char[100];
        Finalizer final([&]
        {
            delete[] arr;
            wcout << L"Test2 : Delete Arr" << endl;
        });
        //do Something
        wcout << L"Test2 : Code End" << endl;
        
        throw L"Exception";
        
        return;        
    }
    catch (...)
    {
        wcout << L"Test2 : Exception" << endl;
    }    
}


하지만 이 코드는 문제가 하나 있는데, 코드 흐름이 다르다는겁니다

final2.png


블록을 빠져나오는것이 catch 로 넘어가는것보다 우선이기 때문에 finally 로 사용하려 했던 코드가 예외처리 코드보다 먼저 실행되어 버립니다.

이걸 해결하는건, C++은 블럭을 자유롭게 구성할 수 있다는걸 이용해서.. 바깥에 블록을 하나 더 만들어서 해결합니다




void test3()
{
    {
        Finalizer final;
        try
        {
            char* arr = new char[100];
            final.SetFunction([&]
            {
                delete[] arr;
                wcout << L"Test3 : Delete Arr" << endl;
            });
            //do Something
            wcout << L"Test3 : Code End" << endl;

            throw L"Exception";

            return;
        }
        catch (...)
        {
            wcout << L"Test3 : Exception" << endl;
        }
    }
}


위 코드는 어차피 저 코드밖에 없기 때문에 추가적인 블록이 필요 없긴 하지만... 일반적으론 그런 코드는 많지 않겠지요


final3.png


실행결과는 다음과 같습니다.
finally 블록이 다른 언어에서의 코드와 다르게 맨 뒤가 아닌 중간에 와야 하는게 맘에 들진 않는데...
대신 다른 언어에서 try 블록 내부에 선언된 변수를 finally 에서 쓸 수 없어 변수만 위쪽으로 옮기거나 하는 단점이 사라져 좋아진 것도 있습니다.


뭐 어차피 급하게 쓸때 쓰는 "꼼수" 라서요


PS. 테스트는 메모리 해제 코드로 했는데..... 메모리는 그냥 unique_ptr 이나 shared_ptr 계열 쓰세요 (...)

PS2. 더 좋은 방법 있으시면 좀 알려주세요.


아래는 전체 테스트 코드입니다

#include <iostream>
#include <functional>

using namespace std;

class Finalizer
{
public:
    Finalizer()
    {

    }
    Finalizer(std::function<void(void)> fPtr)
    {
        this->fPtr = fPtr;
    }
    ~Finalizer()
    {
        if (fPtr != nullptr) fPtr();
    }
    void SetFunction(std::function<void(void)> fPtr)
    {
        this->fPtr = fPtr;
    }
private:    
    std::function<void(void)> fPtr;
};


void test1()
{
    char* arr = new char[100];
    Finalizer final([&]
    {
        delete[] arr;
        wcout << L"Test1 : Delete Arr" << endl;
    });

    //do Something
    wcout << L"Test1 Code End" << endl;
    
    return;
}

void test2()
{
    try
    {
        char* arr = new char[100];
        Finalizer final([&]
        {
            delete[] arr;
            wcout << L"Test2 : Delete Arr" << endl;
        });
        //do Something
        wcout << L"Test2 : Code End" << endl;
        
        throw L"Exception";
        
        return;        
    }
    catch (...)
    {
        wcout << L"Test2 : Exception" << endl;
    }    
}

void test3()
{
    {
        Finalizer final;
        try
        {
            char* arr = new char[100];
            final.SetFunction([&]
            {
                delete[] arr;
                wcout << L"Test3 : Delete Arr" << endl;
            });
            //do Something
            wcout << L"Test3 : Code End" << endl;

            throw L"Exception";

            return;
        }
        catch (...)
        {
            wcout << L"Test3 : Exception" << endl;
        }
    }
}

void wmain()
{
    test1();
    wcout << endl;
    test2();
    wcout << endl;
    test3();
}
TAG •
?

Lyn
조회 수 3093 추천 수 0 댓글 0
Atachment
첨부 '4'
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

네. 요즘 고해상도 디스플레이(맥북 프로 레티나 라거나, 4K 모니터 라거나, 아니면 Razer Blade나 Aorus X3 Plus 같은) 디바이스가 꽤 늘어 났습니다.

이런놈들 말이죠


dpi3.png


dpi4.png






하지만 윈도는 고해상도 지원 꽤 느린편이어서 Vista 부터 일단 지원은 햇지만 거의 쓰이지 않았고 본격적인 지원은 역시 8 부터라고 보이는데요. 뭐 사실 윈도 7이 나온 2009년보다도 한참 지난 2012년 맥북 프로 레티나 부터 PC/랩탑용 고해상도 디스플레이가 등장 했으니 그러려니 합니다.


어쨋든 중요한건 이제 저런 장비를 쓰는 사람들도 있고 하니 고 DPI 지원을 해야 한다는거겠지요.
그러려면 DPI 를 가져와야 하는데 그 방법중 하나인 Direct2D 를 이용한 방법을 간단히 정리 해 둡니다.


개발자 답게 코드부터 보자면 

#include <iostream>
#include <D2d1.h>

using namespace std;

#pragma comment(lib, "D2d1.lib")

void wmain()
{
    ID2D1Factory* pD2DFactory = nullptr;
    if (SUCCEEDED(D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &pD2DFactory)))
    {
        float dpix, dpiy;
        pD2DFactory->ReloadSystemMetrics();
        pD2DFactory->GetDesktopDpi(&dpix, &dpiy);
        pD2DFactory->Release();

        wcout << L"X : " << dpix << endl << L"Y : " << dpiy << endl;
    }
    else
    {
        wcout << L"Direct 2D Create Error";
    }    
}

라는 대단히 심플 한 코드로 가져올 수 있습니다.

D2D 팩토리를 생성후 ReloadSystemMetrics 호출 후 GetDesktopDpi 를 통해서 가져오는 매우 심플한 방식인데, ReloadSystemMetrics  를 하지 않으면 팩토리 생성 후 변화된 Dpi 설정을 가져오지 못합니다(내부에서 캐시하는듯)


dpi1.png




위와 같은 실행 결과가 나옵니다. 윈도우의 기본 DPI(100%) 값은 96 으로서 이는 23인치 FullHD에 맞도록 세팅 된 값입니다(사실 "현재까지 쓰인 일반적인" 모니터의 크기와 해상도라면 대부분 매칭 됩니다. 17인치 1280*1024 도 96DPI 입니다)

그럼 125%로 바꿔서 한번 테스트 해 보겠습니다.

dpi2.png


 

네. 96 * 1.25 = 120 이니까 정확히 나오네요.

 

당연하겠지만 Direct2D 를 사용 한 방식이므로 Windows Vista Sp2 or Higher 를 요구합니다.

TAG •
?

Lyn
조회 수 51774 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

윈도우즈 정기 업데이트 날이죠 (...)


이번엔 꽤 중요한 보안 이슈(원격 실행 취약점)가 해결되었다고 하니 꼭 패치하세요


https://technet.microsoft.com/library/security/ms14-dec

?

Lyn
조회 수 12810 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

이게 정말 좋은 소식이지요 : )


http://www.visualstudio.com/en-us/products/visual-studio-community-vs


Pro급에 해당하는 에디션이며 사용 조건은 아래와 같습니다


Q: Who can use Visual Studio Community? 

A: Here’s how individual developers can use Visual Studio Community:

Any individual developer can use Visual Studio Community to create their own free or paid apps.

Here’s how Visual Studio Community can be used in organizations:

An unlimited number of users within an organization can use Visual Studio Community for the following scenarios: in a classroom learning environment, for academic research, or for contributing to open source projects.

For all other usage scenarios: In non-enterprise organizations, up to 5 users can use Visual Studio Community. In enterprise organizations (meaning those with >250 PCs or > $1MM in annual revenue), no use is permitted beyond the open source, academic research, and classroom learning environment scenarios described above.

?

Lyn
조회 수 64223 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

http://www.visualstudio.com/news/vs2015-preview-vs


기존에 14라고 부르던 버전이군요. 정식출시가 얼마 남지 않은 것 같습니다.
더 좋은 소식도 있지만

?

Lyn
조회 수 46446 추천 수 0 댓글 0
Atachment
첨부 '4'
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

1. nuget 사이트에서 nuget command-line utility 를 다운로드 받는다.

01.png


2. nuget.exe를 적당한곳에 복사하고 nuget install redis-64 를 입력한다

(redis-64 패키지의 주소는 http://www.nuget.org/packages/redis-64/   이지만 별로 중요하지 않다. 패키지 명만 알면 됨)

02.png


설치된 redis 는 C:\Redis-64.2.8.17 에 있다.(현재 최신버전인 2.8.17 기준)


3. redis 를 서비스로 등록하기 위해 redis 설치 폴더로 이동해서 아래와 같은 명령을 친다(관리자권한이 필요하다)

redis-server --service-install redis.windows.conf


여기서의 redis.windows.conf는 기본적으로 존재하는 redis 설정 파일이다. 만약 다른설정파일이 있으면 원하는대로 수정 하면 OK

만약 여러개 생성하는것이 목적이라면(사실 달랑 하나 쓸 경우보단 여러개 띄울 경우가 많을거다... redis 는 single thread밖에 사용하지 못하기 때문에)

–service-name redisServiceName –port 10000 처럼 서비스명과 포트번호를 추가하여 여러개 띄울 수 있다


03.png


4. 서비스를 시작시키고 redis-cli 를 실행시켜 테스트 해본다

04.png



정상이다 : ) 이제 잘 갈궈서 (...) 써먹을일만 남았다



TAG •
?

Lyn
조회 수 18209 추천 수 0 댓글 0
Atachment
첨부 '1'
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

http://lunapiece.net/Article/14007327


이전글에서 나왔던 문제가 해결된 버전이 나왔습니다. 업데이트하세요104.png


?

Lyn
조회 수 22711 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

정성태님의 홈페이지를 정독하던중 오랫만에 C++ 관련 글이 하나 올라 왔길래 확인해 보았습니다.
바로 g++에서 inner 클래스를 사용한 템플릿이 제대로 선언 되지 않는다는 문제인데요, 코드는 아래와 같습니다(조금 다릅니다. 원본에 오타가 있어서 좀 고쳣습니다)


원본 : http://www.sysnet.pe.kr/Default.aspx?mode=2&sub=0&pageno=0&detail=1&wid=1791


#include <iostream>
#include <vector>
#include <map>

typedef char BYTE;
typedef int _int;
typedef std::vector<BYTE> _byteArrayHolder;
typedef long _long;

template <class T, class V>
class KeepAliveReceiver
{
};

template<class Receiver, class ErrorAction, _int MAX_CONTENT_SIZE = 8192>
class MultiPartByteArrayReceiver : public KeepAliveReceiver< MultiPartByteArrayReceiver<Receiver, ErrorAction>, ErrorAction>
{
	class MultiPartByteArray
	{
	public:
		_int key;
		std::vector<BYTE> byteHolders;
		_long totalSize;

	public:
		MultiPartByteArray(_int _key) : key(_key), byteHolders(), totalSize(0)
		{
		}

		void AddBytes(_byteArrayHolder bytes)
		{
			totalSize += bytes.size();
		}
	};

	typedef KeepAliveReceiver< MultiPartByteArrayReceiver<Receiver, ErrorAction, MAX_CONTENT_SIZE>, ErrorAction> Super;
	typedef MultiPartByteArrayReceiver<Receiver, ErrorAction, MAX_CONTENT_SIZE> This;

public:
	typedef std::map<_int, MultiPartByteArray>  MultiPartBytesMap;
	MultiPartBytesMap receivedMultiPartedBytes;

public:

	MultiPartByteArrayReceiver() : Super(), receivedMultiPartedBytes()
	{}

	void Test()
	{
		MultiPartByteArray a(1);
		std::map<_int, MultiPartByteArray>::iterator iter = receivedMultiPartedBytes.find(1); //컴파일 오류
	}
};

int main()
{
	std::cout << "Hello World" << std::endl;

	MultiPartByteArrayReceiver<int, int> t;
	t.Test();

	return 0;
}


바로 위와 같은 코드인데, 이는 template 이 완전히 생성 되기 전에, 그 템플릿에 의존하는 type을 인식할 수 없기 때문에 발생합니다
(이런 경우는 템플릿 클래스가 부모 템플릿의 함수를 호출한다거나 할때도 발생합니다)

VC++은 그냥 적당히 알아서 (...) 인식해서 넘어 가는데 이걸 오류로 처리하는 컴파일러도 있습니다. 뭐 만드는사람 취향문제겟지만.


이 문제의 해결법은 바로 type을 인식하지 못하는 것이니 이게 template의 type 명을 나타낸다고 알려주는겁니다.
바로 typename 키워드를 쓰는것인데 그럼 아래와 같게 됩니다



typename std::map<_int, MultiPartByteArray>::iterator iter = receivedMultiPartedBytes.find(1); //컴파일 오류 


이렇게 하면 뒤의 템플릿 선언문을 타입으로 인식하여 정상적으로 컴파일 됩니다. 물론 VC에서도 마찬가지입니다.
또 템플릿을 선언 할 때 처럼 class 키워드를 써도 OK 입니다. 전 typename 키워드가 헤깔리지 않아 선호하는 편이지만요


PS. 사실 이 모든 문법적 지저분함을 해결하는 마법의 키워드가 C++에 있으니...

그냥 auto 쓰면 됩니다 (...) C++11에서 추가된 auto와 decltype 의 타입추론 시스템은 템플릿을 정말 간단하게 만들어주는 축복이지요

TAG •
?

Atachment
첨부 '1'
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

11월 6일 현재 해결되었습니다. VMWare 업데이트 하세요

관련링크 : http://lunapiece.net/Article/14007397



uhul.png


어제 업데이트 된 2014년 10월 정기 업데이트(한국시각 10월 15일) 이후 VMWare 에서 메모리 오류가 발생합니다.

이는 KB2995388 와 관련된 오류로서, 이를 업데이트 하지 않음으로서 일시적으로 방지할 수 있습니다.

(이미 업데이트 했다면 저것만 골라서 언인스톨해도 OK입니다)


아마 VMWare 측에서 새로운 업데이트가 나오지 않을까 싶네요



?

Atachment
첨부 '3'
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

오늘 같은 MS VC++ MVP이신 유영천 님께서 개인 프로젝트로 출시하신 Project D Online(Steam에서 즐기실 수 있습니다)에 재밋는 이슈가 발생하였습니다.

바로 vmovd eax,xmm0 명령어에서 illegal instruction 오류를 내면서 크래시가 난다는건데요, 원인분석의 결과를 한번 공유해 보겠습니다.


인텔에서는 2011년 새로운 SIMD 명령어인 AVX를 지원하는 CPU를 출시 하였고, 당연히 그 이후 각 컴파일러들은 해당 명령어에 대한 지원을 시작하엿고 당연히 현재 최신의 MS C++ 컴파일러인 VC++2013버전에서는 2011년에 출시된 AVX 명령어를 지원 하고 있습니다.


AVX를 지원하는 CPU는 아래와 같습니다. 출처는 영문판 위키입니다

원본 : http://en.wikipedia.org/wiki/Advanced_Vector_Extensions

 


인텔은 샌디브릿지 이상, AMD는 불도저 이상이군요. 저도 하스웰-E 가지고싶습니다...


VC++2013의 intrin.h에는 각 어셈명령어와 매칭되는 함수들과 타입이 제공 되고, dvec.h 에는 2개의 클래스 F32vec8과 F64vec4가 제공됩니다.
각각 단정밀도 8개, 배정밀도 4개를 동시에 계산할 수 있는 클래스인데요


극히 간단한 샘플 코드를 돌려 보겠습니다


#include <cstdio>
#include <dvec.h>

int main()
{	
	F32vec8 A(1.1f, 2.1f, 3.1f, 4.1f, 5.1f, 6.1f, 7.1f, 8.1f);
	F32vec8 B(1.1f, 2.1f, 3.1f, 4.1f, 5.1f, 6.1f, 7.1f, 8.1f);		
	
	A += B;

	printf("%f %f %f %f %f %f %f %f", A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7]);
		
	return 0;
}


아래와 같은 경고가 발생하는데, 뭐 일단 여기에선 무시해도 상관 없고, 빌드 옵션에 추가해도 상관 없습니다.
어차피 바이너리엔 영향 없으니까요.


01.png


그럼 위 코드는 어떤 바이너리를 만들어 낼까요?

02.png


대충 이와 같습니다.
v 로 시작하는 명령어들이 AVX명령어 들인데 8개의 float += 연산을 단 한줄로 끝내는것을 볼 수 있습니다.


하지만 세상엔 똥컴(.....) 을 쓰시는분들이 참 많고 당연히 AVX를 지원하지 않는 CPU에서도 프로그램을 돌려야할 경우가 있습니다. 하지만 그렇게 되면 최적화를 상당부분 포기하게 되죠. java나 .net 처럼 JIT 을 지원하는 환경이라면 처음 실행할때 가상머신이 CPU 를 확인해서 최적의 명령어셋으로 만들어 내겠지만(이게 닷넷, 자바의 속도가 간혹 C보다 빨라지는 이유중 하나이기도 합니다) 미리 다 바이너리로 만들어져 있는 Native Application 들은 이런 방법이 불가능 합니다. 

그래서 자주 쓰는 방법은, 미리 CPU 종류별로 다 코드를 컴파일 해 두고, 실행할때 CPU가 지원하는 최적의 명령어를 실행하도록 분기하는거죠... 실제로 극한의 속도를 요하는 라이브러리 (Intel IPP 등) 에서는 당연하다시피 쓰이고 있는 방식이고, 일반적인 라이브러리를 만들때도 쓰이는 경우가 있습니다. 혹시 리눅스에 관심있으신분이라면 최근버전의 리눅스 커널에서 아주 오래된 CPU의 지원이 조금씩 끊기고 있다는것을 아실 수 있는데, 이게 특정 이상의 명령어 셋을 기본적으로 사용하겟다는 의미이기도 합니다.


네 중요한건 바로 여기에 있습니다. VS2013은 내부적 라이브러리에 AVX코드를 생성해서 쓰는 경우가 있다는것이고, cpu의 명령어 셋을 체크 한 후에 쓰기때문에 실행엔 문제가 없어야 합니다만... 현재 명령어 셋을 체크하는것은 cpu만이 아닙니다. 각종 코드 보안 관련 기능에 사용하기 위해 OS도 명령어를 체크하지요.
아래 내용은 역시 영문위키에서 가져왔습니다.... 일일히 찾기귀찮아서


원본 : http://en.wikipedia.org/wiki/Advanced_Vector_Extensions

  • Apple OS X: Support for AVX added in 10.6.8 (Snow Leopard) update[13] released on June 23, 2011.
  • Linux: supported since kernel version 2.6.30,[14] released on June 9, 2009.[15]
  • Windows: supported in Windows 7 SP1 and Windows Server 2008 R2 SP1,[16] Windows 8
  • Windows Server 2008 R2 SP1 with Hyper-V requires a hotfix to support AMD AVX (Opteron 6200 and 4200 series) processors, KB2568088
  • FreeBSD in a patch submitted on 21 January 2012,[17] which was included in the 9.1 stable release[18]
  • DragonFly BSD added support in early 2013.
  • Solaris 10 Update 10 and Solaris 11

  • 리눅스는 굉장히 삐른 편인데 대체 어디서 정보를 얻어서 구현했는진 모르겠습니다(....), 윈도우는 날자가 적혀있지 않아 확인해보니 2011년 3월 15일입니다. 맥은 좀 늦었군요 뭐 어차피 자기들이 하드웨어 내놓을때 같이 내 놓으면 상관없겠습니다. 어차피 OS가 아니라 펌웨어에 가까우니까요


    문제는 여기에서 발생합니다. 바로 CPU는 지원하는데 OS가 지원을 안할 경우입니다 (...)
    위에 써있는것을 보시면 알겠지만 Windows 7은 SP1 이상부터 AVX를 지원합니다. 즉 SP1이 설치되지 않은 구버전의 Windows 7 이라면 AVX명령어가 실행이 되지 않는다는 겁니다....


    그래서 MS는 VC++2013 재배포 패키지( http://www.microsoft.com/en-us/download/details.aspx?id=40784 )  에 다음과 같이 명시 해 두었습니다.

    Supported Operating System

    Windows 7 Service Pack 1, Windows 8, Windows 8.1, Windows Server 2003, Windows Server 2008 R2 SP1, Windows Server 2008 Service Pack 2, Windows Server 2012, Windows Server 2012 R2, Windows Vista Service Pack 2, Windows XP 


    네 분명히 Windows7 SP1 이라고 적혀 있지요.
    문제는... 저게 SP1이 아닌데도 설치가 된다는겁니다 (....)


    03.png



    그냥 재배포 패키지설치시 확인 해서 올리라고 했었어야 할거 같은데... 어쨋든 안해줍니다 그래서 만약을 대비해 버전 체크를 하시는게 좋습니다.
    빌드넘버로 확인할 수 있는 Windows 7은 6.1.7600, Windows7 SP1은 6.1.7601 로 다르니까요.

    안그러면 이런 크래시가 발생할 수 있습니다.


    사실 AVX 같은 확장명령어로 최적화 될 상황이 그리 많지는 않습니다... 저런걸 쓸 상황이 오는건 진짜 대량의 계산을 요하는 프로그램이나, 영상관련 프로그램, 아니면 게임정도니까요.
    그래도 만약을 대비해서 나쁠건 없겟죠.


    그리고 서비스팩이 설치되지 않은 7600버전의 Windows 7은 더이상 어떤 패치도 제공 되지 않는 상황입니다(Sp1을 올려야 나머지 패치가 적용 됩니다) 그러니까 웬만하면 패치좀 하고 씁시다 (...)

    PS. Project D Online 많이좀 해주세요.

    TAG •
    ?

    Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 13 Next
    / 13