2013-03-12 1 views
7

내 응용 프로그램이 nVidia Optimus 랩톱에서 실제 gpu를 사용하여 항상 실행되기를 바랍니다.nVidia Optimus가있는 시스템이 내 애플리케이션에 실제 GPU를 사용하도록 강요합니까?

"옵티머스 시스템에 고성능 그래픽 렌더링을 활성화"에서

(http://developer.download.nvidia.com/devzone/devcenter/gamegraphics/files/OptimusRenderingPolicies.pdf) :

Global Variable NvOptimusEnablement (new in Driver Release 302) Starting with the Release 302 drivers, application developers can direct the Optimus driver at runtime to use the High Performance Graphics to render any application–even those applications for which there is no existing application profile. They can do this by exporting a global variable named NvOptimusEnablement. The Optimus driver looks for the existence and value of the export. Only the LSB of the DWORD matters at this time. A value of 0x00000001 indicates that rendering should be performed using High Performance Graphics. A value of 0x00000000 indicates that this method should be ignored. Example Usage:

extern "C" { _declspec(dllexport) DWORD NvOptimusEnablement = 0x00000001; } 

문제는 내가이 사용하는 델파이를 수행 할 것입니다. Delphi는 일부 해킹이 있어도 변수 내보내기를 지원하지 않습니다. 나는 그들 중 몇 명을 시도했지만 제대로 작동시키지 못했습니다.

같은 nvidia 문서에서 적절한 GPU 강제는 소수의 나열된 DLL 중 하나에 정적으로 연결하여 수행 할 수 있음을 읽었습니다. 그러나 나는 사용하지 않는 DLL에 연결하고 싶지 않다. (opengl.dll이 그 중 하나가 아닌 이유는 무엇입니까?) 간단한 수출 변수는 훨씬 더 깨끗해 보입니다.

+0

응용 프로그램 프로필을 만드는 방법은 무엇입니까? –

+0

이 Q는 속은 것처럼 보입니다 : http://stackoverflow.com/questions/3641983/export-a-global-symbol-from-a-delphi-dll –

+0

C++ 프로그램에서 전역을 내보낼 때 이름이 장식되어 있습니까? . 찾으려면 dumpbin 또는 의존 키를 사용하십시오. 다음 당신의 델피 수출에 동일한 훈장을 적용하십시오. –

답변

3

From what I've read Delphi does not support export of variables.

설명이 잘못되었습니다. 나는 당신의 문제가이처럼 썼다는 생각

library GlobalVarExport; 

uses 
    Windows; 

var 
    NvOptimusEnablement: DWORD; 

exports 
    NvOptimusEnablement; 

begin 
    NvOptimusEnablement := 1; 
end. 

을 :

library GlobalVarExport; 

uses 
    Windows; 

var 
    NvOptimusEnablement: DWORD=1; 

exports 
    NvOptimusEnablement; 

begin 
end. 

을 그리고이 함께 컴파일에 실패 여기 델파이 DLL에서 전역 변수를 내보내는 방법을 보여주는 간단한 예제이다 오류 :

 
E2276 Identifier 'NvOptimusEnablement' cannot be exported 

왜 컴파일러는 두 번째 버전을 좋아하지 않는지 이해할 수 없습니다. 아마 버그 일 겁니다. 그러나 첫 번째 버전의 해결 방법은 훌륭합니다.

+0

OpenGL 래퍼 단위에 var를두고 initilization 섹션에 MOV $ 1을 변수에 넣었습니다. 나는 그렇지 않다면 컴파일러에 의해 무시 될 것이라고 읽었다. PE Explorer를 실행하면 올바른 이름과 값 1로 내보내기가됩니다. 안타깝게도 나에게 옵티 서스 노트북이 없으므로 내일까지 테스트 할 수 없습니다. 하지만 내 문제의 델파이 부분은 해결 될 것으로 보인다. – DelphiDabber

+0

asm을 전혀 사용할 필요가 없습니다. 컴파일러는 전역 변수에 대한 쓰기를 최적화하지 않습니다. –

+0

그렇습니다. 내보내기는 asm이 NvOptimusEnablement : = $ 1;로 바뀌면서 정확합니다. – DelphiDabber

0

저는 Delphi 전문가는 아니지만 AFAIK는 Delphi에서 C로 구현 된 정적 라이브러리에 링크 할 수 있습니다. 그래서 저는 간단히이 스텁 라이브러리를 만들었습니다.이 스텁 라이브러리는 정적으로 델파이 프로그램에 링크되어 있습니다. 이것은 당신이 필요로하는 바로 수출을 추가합니다.

+0

아니요, 정적 라이브러리를 연결할 수 없습니다. –

+0

@DavidHeffernan : 기술적으로 이것은 후 처리 단계에서 PE 바이너리에 적용 할 수 있어야합니다. GNU binutils에는 "objcopy"라는 프로그램이 포함되어 있습니다.이 프로그램은 바이너리 조작과 관련하여 스위스 군용 칼입니다. objcopy를 사용하여 정적 라이브러리를 이미 존재하는 PE .exe로 복사하여 원하는 효과를 낼 수 있습니다. 그냥 생각. 나는 결코 그것을 시도하지 않았다, YMMV, 그러나 나는 그것이 가치가 있을지도 모른다라고 생각한다. – datenwolf

+0

귀하의 답변은 여전히 ​​매우 분명합니다. 사실은 잘못되었습니다. 또한 세계를 수출하는 것도 사소한 일입니다. 코멘트에있는 링크로 표시됩니다. –

관련 문제