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)的方式,截图
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;
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();
运行结果:
案例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的计算结果不相符!");