NVIDIA OpenACC 在线课程 (一) 学习笔记

1. pragma acc kernels[]
{
}
表示可能存在并行性,由编译器分析并行性,并根据分析结果决定是否生成GPU kernels


2. #pragma acc parallel loop 
开发者已经知道该循环可以并行化,不用编译器再来分析并行性;只并行化当前修饰的循环且该循环可以是嵌套的;


Independent clause
开发者知道循环迭代间不存在别名关系,例如 
pragma acc kernels[]
#pragma acc loop independent


3. pragma acc data  
{ }
表示所有的数据都会被保留在GPU平台上,直到到达区域外。{}里面可以是parallel loop或者多个kernels
copyin(a[0:N]) :0是起始位置,N表示元素个数
copyout(a[0:N]) copy(a[0:N]), create() 只分配内存,不拷贝数据;
present(list)已经在GPU上分配了内存,不需要分配
deviceptr:与cuda互操作,表示该指针就是在gpu上的指针


pgi社区版本 免费支持学术界使用,由NVIDIA提供支持,比gcc的支持更好;


PGI编译器指南
pgcc  -acc -Minfo=accel  -Mcuda=cc60 main.c
-ta=tesla 指定体系结构
-Mcuda=cc60 GPU的计算能力, k40的计算能力是cc35, p100计算能力是cc60
-Mcuda=keepgpu  生成kernel文件,但是可读性差;也可以保留到ptx代码
会打印编译信息
PGI_ACC_TIME=1 ./a.out




OpenACC默认是同步执行的;CUDA默认是异步执行的;


pragma acc loop gang, vector(128)  gang是指block,vector是指block内的线程数目
没有支持python的计划;

你可能感兴趣的:(技术文章)