天天看点

项目优化之:GPU编程



1gpu编程,依赖于显卡

2gpu变成依赖于opengl和direct

3cpu的特点是:频率比较快,gpu的特点是寄存器非常非常的多。

4如果电脑是windows7,没法直接调试gpu。window8可以直接调试

5用vs2013新建一个项目,命名:gpu

6调试gpu的方式是vs中的:打断点—>运行项目à调试à窗口àgpu线程(通过这种方式实现调试gpu项目)

8.修改项目属性:右击项目à属性à配置属性à常规,修改调试器类型为仅gpu

修改amp默认快捷键可以选择时时(use

c++ amp runtime default)的方式,也可以使用软件加速器(warpsoftware accelerator)的方式,截图

项目优化之:GPU编程

9.代码:

#include

<iostream>

<amp.h> 

//gpu编程所需的头文件

using

namespace

concurrency;

int

main()

{

v[11] = {

'g',

'd',

'k',

'n', 31,

'v',

'n',

'q',

'c' };

array_view<int>

av(11,

v);//array_view是gpu计算结构,av存储到gpu显存

//=表示直接操作av

//(index<1> idx)操作每一个元素

//restrict(amp)定位gpu执行

parallel_for_each(av.extent,

[=](index<1>

idx)

restrict(amp)

av[idx]

+= 1;//加完后变成了hello world

});

for (unsigned

i = 0;

i < 11;

i++)

std::cout

<< static_cast<char>(av[i]);

}

std::cin.get();

return 0;

项目优化之:GPU编程

10.cpu,gpu单值计算效率测试

案例:

<iostream> 

<amp.h>

<winbase.h>

#define

count 100000

float

nickname_gpu[count];

nickname_cpu[count];

//gpu并行计算比较占有优势,restrict(amp):限制使用gpu编程

double

rungpu(int

num)

temp = 0;

for (int

i <

num;

temp +=

i;

return

temp;

//cpu处理单值计算比较有优势,单点计算比较有优势,只能在gpu内部执行

runcpu(int

restrict(cpu)

//这是对一个数进行操作

//限制使用gpu或cpu运行

runcpugpu(int

restrict(amp,

cpu)

//测试单值计算的运行效率

large_integer

freq;

strt;

ed;

queryperformancefrequency(&freq);

queryperformancecounter(&strt);

dx[1] = { 0.0 };

double 

db = 0.0;

concurrency::array_view<double>

myview(1,

dx);

parallel_for_each(myview.extent,

[=](concurrency::index<1>

myview[idx]

+= rungpu(1000000);

myview.synchronize();//显式等待gpu计算完成并将数据打回内存

printf("%f\n",

dx[0]);

queryperformancecounter(&ed);

printf("gpu耗时:

%d 毫秒\r\n", (ed.quadpart

- strt.quadpart)

* 1000 / freq.quadpart);

runcpu(1000000));

printf("cpu耗时:

puts("测试结束");

getchar();

运行结果:

项目优化之:GPU编程

案例2:

count 3000

double temp = 0;

temp += i;

return temp;

large_integer freq;

large_integer strt;

large_integer ed;

concurrency::array_view<float>

myview(count,

nickname_gpu);

//将数据打入显存 

concurrency::parallel_for_each(myview.extent,

count / 10;

myview[idx] = (myview[idx]

+ 0.1f) / 2.3f;

myview.synchronize();//显式等待gpu计算完成并将数据打回内存 

- strt.quadpart) * 1000 / freq.quadpart);

idx = 0; idx <

count; idx++)

nickname_cpu[idx] = (nickname_cpu[idx]

+ 0.1f) /2.3f;

if (nickname_cpu[idx]

!= nickname_gpu[idx])

puts("cpu和gpu的计算结果不相符!");

项目优化之:GPU编程