NVIDIA Optimus技术和CUDA

Nvidia称Optimus是一个革命性的技术,它可以延长笔记本电脑续航时间,同时获得很好的性能。这种技术使得硬件能够自己选择使用那个显卡来计算。一般使用GPU计算的应用、视频、3D游戏等会被安排在高性能的NVIDIA GPU上执行,一些像Office、Web冲浪,电子邮件类似的应用会被安排在集成显卡上执行。

如果你的笔记本有两块显卡,一块是Intel的集成显卡(IGP),一块是Nvidia的独立GPU,你的笔记本一般采用了Optimus技术。在使用CUDA的时候,务必要理解Optimus,才能很好的使用你的笔记本来开发CUDA程序。

1、在运行自己的CUDA程序时,小心自己的程序找不到CUDA设备!(因为实现默认的是IGP奥)

2、在使用Direct3D与CUDA、OpenGL与CUDA互操作时,开发人员要注意一些限制!

针对以上限制,注意说明:

1、查询CUDA设备:

// CUDA Runtime API Version
inline int cutGetMaxGflopsDeviceId() 
{ 
    int current_device   = 0, sm_per_multiproc = 0; 
    int max_compute_perf = 0, max_perf_device  = 0; 
    int device_count     = 0, best_SM_arch     = 0; 
    int arch_cores_sm[3] = { 1, 8, 32 }; 
    cudaDeviceProp deviceProp; 
 
    cudaGetDeviceCount( &device_count ); 
 
    // Find the best major SM Architecture GPU device 
    while ( current_device < device_count ) { 
        cudaGetDeviceProperties( &deviceProp, current_device ); 
        if (deviceProp.major > 0 && deviceProp.major < 9999) { 
            best_SM_arch = max(best_SM_arch, deviceProp.major); 
        } 
        current_device++; 
    } 
 
    // Find the best CUDA capable GPU device 
    current_device = 0; 
    while( current_device < device_count ) { 
        cudaGetDeviceProperties( &deviceProp, current_device ); 
        if (deviceProp.major == 9999 && deviceProp.minor == 9999) { 
            sm_per_multiproc = 1; 
        } else if (deviceProp.major <= 2) { 
            sm_per_multiproc = arch_cores_sm[deviceProp.major]; 
        } else { // Device has SM major > 2 
            sm_per_multiproc = arch_cores_sm[2]; 
        } 
 
        int compute_perf = deviceProp.multiProcessorCount *  
                           sm_per_multiproc * deviceProp.clockRate; 
 
        if( compute_perf > max_compute_perf ) { 
            // If we find GPU of SM major > 2, search only these 
            if ( best_SM_arch > 2 ) { 
                // If device==best_SM_arch, choose this, or else pass 
                if (deviceProp.major == best_SM_arch) {   
                    max_compute_perf  = compute_perf; 
                    max_perf_device   = current_device; 
                }  
            } else { 
                max_compute_perf  = compute_perf; 
                max_perf_device   = current_device; 
            } 
        } 
        ++current_device; 
    } 
 
    cudaGetDeviceProperties(&deviceProp, max_compute_perf_device); 
    printf("\nDevice %d: \"%s\"\n", max__perf_device,  
                                    deviceProp.name); 
    printf("Compute Capability   : %d.%d\n",  
            deviceProp.major, deviceProp.minor); 
    return max_perf_device; 
}

声明下哈,这个代码并不是我写的,在参考文献里粘贴的奥。这是官方给出的代码。大家可以参考着写出适合自己的代码,要是你想直接考走就用,建议你还是别看了,直接请别人给你做得了!!

2、Direct3DCUDAOpenGLCUDA互操作:

代码以蔽之!

// CUDA/Direct3D9 interop 
    // You will need to create the D3D9 context first 
IDirect3DDevice9 * g_pD3D9Device; // Initialize D3D9 rendering device 
    // After creation, bind your D3D9 context to CUDA 
cudaD3D9SetDirect3DDevice(g_pD3D9Device);


// CUDA/Direct3D9 interop 
    // You will need to create the D3D9 context first 
IDirect3DDevice9 * g_pD3D9Device; // Initialize D3D9 rendering device 
    // After creation, bind your D3D9 context to CUDA 
cudaD3D9SetDirect3DDevice(g_pD3D9Device);


// CUDA/Direct3D11 interop 
    // You will need to first create the D3D11 context first 
      ID3D11Device      * g_pD3D11Device; // Initialize D3D11 rendering device 
    // After creation, bind your D3D11 context to CUDA 
      cudaD3D11SetDirect3DDevice(g_pD3D11Device);


// For CUDA/OpenGL interop 
    // You will need to create the OpenGL Context first 
    // After creation, bind your D3D11 context to CUDA 
       cudaGLSetGLDevice(deviceID);


会写上面这些代码,并且可以熟练使用这些互操作接口后,你不一定能得到正确的结果奥,或者你的程序根本就不能运行!呵呵,这是为什么那。很可能的原因是你在使用cuda提供的互操作接口之前,DX、OpenGL的图形上下文可能已经被用在了IGP上了,所以会导致失败。解决方法:

1.使用支持Optimus功能的笔记本用户可以在Nvidia Control panel的3DSettings->Manage3DSettings中将需要运行的程序加入到列表中,并将它们的preferred processor设置为High-performance Nvidia processor。

2.程序编写者应该按照最新的方法修改代码。方法是首先创建一个不与设备绑定的OpenGL/D3D上下文;然后枚举所有CUDA设备并创建CUDA上下文;再把CUDA上下文所在设备与OpenGL/D3D上下文绑定;最后再将CUDA上下文与OpenGL/D3D上下文绑定。

参考:

【1】:NVIDIA CUDA Developer Guide for NVIDIA Optimus Platforms

【2】:http://hpcbbs.it168.com/forum.php?mod=viewthread&tid=5958&fromuid=26008496

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Optimus2022是一款功能强大的软件,它主要用于帮助用户优化计算机性能和提高系统效率。用户可以通过下载和安装这款软件来获得更好的电脑使用体验。 首先,用户可以在官方网站或其他可信赖的软件下载平台上找到并下载Optimus2022软件。下载完成后,用户可以按照安装向导的提示进行安装,通常只需几步操作即可完成。 安装完成后,用户可以打开Optimus2022软件,并进行设定和优化。该软件提供了多个功能模块,包括系统调整、磁盘清理、注册表修复、程序卸载等。用户可以根据自己的需求选择相应的功能来进行优化操作。 例如,用户可以使用系统调整功能来优化系统启动速度和运行效果。该功能可以帮助用户关闭不必要的自启动项、优化系统设置,从而减少系统开机时间和提高系统运行速度。 用户还可以使用磁盘清理功能来清理硬盘中的垃圾文件和临时文件,释放磁盘空间。这样可以提高系统响应速度和整体性能,并为用户留出更多的存储空间。 此外,Optimus2022还提供了注册表修复功能,可以扫描和修复注册表中的错误和无效项。这可以帮助用户解决系统出现的问题和错误,提高系统稳定性和安全性。 总之,Optimus2022是一款能够提升电脑性能和系统效率的优秀软件。用户可以通过下载该软件并进行相应的设定和优化来改善他们的计算机使用体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值