OpenACC 计算构建内的自定义函数

? 使用 routine 构件创建的自定义函数,在并行调用上的差别

● 代码,自定义一个 sqab 函数,使用内建函数 fabsf 和 sqrtf 计算一个矩阵所有元素绝对值的平方根

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <math.h>
 4 #include <openacc.h>
 5
 6 #define ROW 8
 7 #define COL 64
 8
 9 #pragma acc routine vector
10 void sqab(float *a, const int m)
11 {
12 #pragma acc loop
13     for (int idx = 0; idx < m; idx++)
14         a[idx] = sqrtf(fabsf(a[idx]));
15 }
16
17 int main()
18 {
19     float x[ROW][COL];
20     int row, col;
21     for (row = 0; row < ROW; row++)
22     {
23         for (col = 0; col < COL; col++)
24             x[row][col] = row * 10 + col;
25     }
26     printf("\nx[1][1] = %f\n", x[1][1]);
27
28 #pragma acc parallel loop vector pcopy(x[0:ROW][0:COL]) // 之后在这里分别添加 gang,worker,vector
29     for (row = 0; row < ROW; row++)
30         sqab(&x[row][0], COL);
31     printf("\nx[1][1] = %f\n", x[1][1]);
32
33     //getchar();
34     return 0;
35 }

● 输出结果,第 28 行不添加并行级别子句(默认使用 gang)

 1 D:\Code\OpenACC\OpenACCProject\OpenACCProject>pgcc main.c -acc -Minfo -o main_acc.exe
 2 sqab:
 3      11, Generating Tesla code
 4          13, #pragma acc loop vector /* threadIdx.x */
 5      13, Loop is parallelizable
 6 main:
 7      28, Generating copy(x[:][:])
 8          Accelerator kernel generated
 9          Generating Tesla code
10          29, #pragma acc loop gang /* blockIdx.x */
11
12 D:\Code\OpenACC\OpenACCProject\OpenACCProject>main_acc.exe
13
14 x[1][1] = 11.000000
15 launch CUDA kernel  file=D:\Code\OpenACC\OpenACCProject\OpenACCProject\main.c function=main
16 line=28 device=0 threadid=1 num_gangs=8 num_workers=1 vector_length=32 grid=8 block=32      // 8 个 gang 在 blockIdx.x 层级,1 个 worker,vector 在 threadIdx.x 层级
17
18 x[1][1] = 3.316625
19 PGI: "acc_shutdown" not detected, performance results might be incomplete.
20  Please add the call "acc_shutdown(acc_device_nvidia)" to the end of your application to ensure that the performance results are complete.
21
22 Accelerator Kernel Timing data
23 D:\Code\OpenACC\OpenACCProject\OpenACCProject\main.c
24   main  NVIDIA  devicenum=0
25     time(us): 9
26     28: compute region reached 1 time
27         28: kernel launched 1 time
28             grid: [8]  block: [32]
29             elapsed time(us): total=1000 max=1000 min=1000 avg=1000
30     28: data region reached 2 times
31         28: data copyin transfers: 1
32              device time(us): total=4 max=4 min=4 avg=4
33         31: data copyout transfers: 1
34              device time(us): total=5 max=5 min=5 avg=5

● 输出结果,第 28 行添加并行级别子句 worker

 1 D:\Code\OpenACC\OpenACCProject\OpenACCProject>pgcc main.c -acc -Minfo -o main_acc.exe
 2 sqab:
 3      11, Generating Tesla code
 4          13, #pragma acc loop vector /* threadIdx.x */
 5      13, Loop is parallelizable
 6 main:
 7      28, Generating copy(x[:][:])
 8          Accelerator kernel generated
 9          Generating Tesla code
10          29, #pragma acc loop worker(4) /* threadIdx.y */
11      29, Loop is parallelizable
12
13 D:\Code\OpenACC\OpenACCProject\OpenACCProject>main_acc.exe
14
15 x[1][1] = 11.000000
16 launch CUDA kernel  file=D:\Code\OpenACC\OpenACCProject\OpenACCProject\main.c function=main
17 line=28 device=0 threadid=1 num_gangs=1 num_workers=4 vector_length=32 grid=1 block=32x4    // 1 个 gang,4 个 worker 在 threadIdx.y 层级,使用 2 维线程网格
18
19 x[1][1] = 3.316625
20 PGI: "acc_shutdown" not detected, performance results might be incomplete.
21  Please add the call "acc_shutdown(acc_device_nvidia)" to the end of your application to ensure that the performance results are complete.
22
23 Accelerator Kernel Timing data
24 D:\Code\OpenACC\OpenACCProject\OpenACCProject\main.c
25   main  NVIDIA  devicenum=0
26     time(us): 10
27     28: compute region reached 1 time
28         28: kernel launched 1 time
29             grid: [1]  block: [32x4]
30              device time(us): total=0 max=0 min=0 avg=0
31     28: data region reached 2 times
32         28: data copyin transfers: 1
33              device time(us): total=5 max=5 min=5 avg=5
34         31: data copyout transfers: 1
35              device time(us): total=5 max=5 min=5 avg=5

● 输出结果,第 28 行添加并行级别子句 vector

 1 D:\Code\OpenACC\OpenACCProject\OpenACCProject>pgcc main.c -acc -Minfo -o main_acc.exe
 2 sqab:
 3      11, Generating Tesla code
 4          13, #pragma acc loop vector /* threadIdx.x */
 5      13, Loop is parallelizable
 6 main:
 7      28, Generating copy(x[:][:])
 8          Accelerator kernel generated
 9          Generating Tesla code
10          29, #pragma acc loop seq
11      29, Loop is parallelizable
12
13 D:\Code\OpenACC\OpenACCProject\OpenACCProject>main_acc.exe
14
15 x[1][1] = 11.000000
16 launch CUDA kernel  file=D:\Code\OpenACC\OpenACCProject\OpenACCProject\main.c function=main
17 line=28 device=0 threadid=1 num_gangs=1 num_workers=1 vector_length=32 grid=1 block=32      // 1 个 gang,1 个 worker,并行全都堆在 threadIdx.x 层级上
18
19 x[1][1] = 3.316625
20 PGI: "acc_shutdown" not detected, performance results might be incomplete.
21  Please add the call "acc_shutdown(acc_device_nvidia)" to the end of your application to ensure that the performance results are complete.
22
23 Accelerator Kernel Timing data
24 D:\Code\OpenACC\OpenACCProject\OpenACCProject\main.c
25   main  NVIDIA  devicenum=0
26     time(us): 10
27     28: compute region reached 1 time
28         28: kernel launched 1 time
29             grid: [1]  block: [32]
30             elapsed time(us): total=1000 max=1000 min=1000 avg=1000
31     28: data region reached 2 times
32         28: data copyin transfers: 1
33              device time(us): total=5 max=5 min=5 avg=5
34         31: data copyout transfers: 1
35              device time(us): total=5 max=5 min=5 avg=5

● 如果自定义函数并行子句等级高于主调函数,则主调函数并行子句会变成 seq;如果自定义函数并行子句等级低于内部并行子句等级,则会报 warning,忽略掉内部并行子句:

1 #pragma acc routine vector
2 void sqab(float *a, const int m)
3 {
4 #pragma acc loop worker
5     for (int idx = 0; idx < m; idx++)
6         a[idx] = sqrtf(fabsf(a[idx]));
7 }

● 编译结果(运行结果通上面的 worker,不写)

D:\Code\OpenACC\OpenACCProject\OpenACCProject>pgcc main.c -acc -Minfo -o main_acc.exe
PGC-W-0155-acc loop worker clause ignored in acc routine vector procedure  (main.c: 13)
sqab:
     11, Generating Tesla code
         13, #pragma acc loop vector /* threadIdx.x */
     13, Loop is parallelizable

原文地址:https://www.cnblogs.com/cuancuancuanhao/p/9419372.html

时间: 2024-07-30 08:21:55

OpenACC 计算构建内的自定义函数的相关文章

Mysql函数(内置函数,自定义函数)

简述 SQL:结构化查询语言,是一门编程语言,是用于管理数据库的编程语言. 元素:数据,数据类型,变量,函数,流程控制,运算符,注释. 注释: 行: # –[空格] 块: /* */ select * from swpu_stu #where id=2; ; select * from swpu_stu -- where id=2; ; 结束符: select * from swpu_stu where id=2\g select * from swpu_stu where id=2\G 可以使

MYSQL 常见的内置函数与自定义函数

MySQL 内置函数: 字符函数 数值函数 时间日期函数 常见的数值函数的使用: 1 select avg(tdb_goods) from tdb_goods; //求字段值的平均数 内置的求和函数: 1 select sum(goods_price) from tdb_goods; //求字段值的和 常见的日期函数举例 1 select now(); 1 select current_timestamp(); 用户自定义函数: 语法 20.2.1. CREATE PROCEDURE和CREAT

5.Smart使用内置函数或者自定义函数

1.使用内置函数 例如使用date函数 {"Y-m-d"|date:$time}格式{第一个参数|方法:第二个参数:第三个参数}即可转换成 2016-07-19  2.使用resigeterPlugin注册到smarty模板里面 先自定义函数 function ownFun($arr){ $p1 = $arr['p1']; $p2 = $arr['p2']; return "引入的第一个参数是".$p1." 第二个参数是".$p2; } 注册到模

发布一个计算桩号之差的Excel自定义函数(VBA)

这是一个可以计算桩号之差(也就是得到长度)的Excel(或WPS)扩展函数,可以减少工程师在统计工程量时的工作量. 该函数具有一定的通用性.可以在MS Office和金山WPS上使用. 文末会给出使用本函数的简单步骤,关于如何在Excel(或WPS)中自定义函数的较详细介绍请移步这里[1]. 将下面内容复制到模块中去,保存后即可使用自定义的ZH_Len函数计算两个桩号之间的长度. '函数:ZH_Len '作用:起终点桩号之差(返回数字) '作者:@我只是一小小鸟 [email protected

python自定义函数、常用内置函数

1.python自定义函数 Python中用户自己编写的用于实现特定功能的函数代码块,就是自定义函数. 如: def是关键字,saa是自定义函数名,括号用于传参,可以不写参数,冒号后面是函数代码块,这里只写了一条print语句 注意:函数不调用不执行,只有调用函数才会执行 小练习1: 执行结果是: : 再来看一个小练2: 这是一个用来生成双色球的小程序,如蓝色球号码 01 红色球 22 12 23 14 05 26,蓝色球数字范围1-16,红色球数字范围1-33,最后一行调用produce()自

自定义函数及内置函数

动态参数:元组.字典的传值 //直接使用名称调用相当于把元组.字典整个传递给了一个形参 //元组前面加*,使元组里面的值分别传递给形参 //字典前面加**,使字典里面的值分别传递给形参 返回值 //函数被调用后会返回一个指定的值 //函数被调用后默认返回None //return 返回值 //返回值可以是任意类型 //return执行后,函数终止 //区分返回值和打印 局部变量.全局变量 //函数内部的变量为局部变量,函数外定义的变量为全局变量 局部变量前加 global 把局部变量变为全局变量

MySQL学习笔记-自定义函数

MySQL学习笔记-自定义函数 1.自定义函数简介 自定义函数:用户自定义函数(user-defined function,UDF)是一种对MySQL扩展的途径,其用法与内置函数相同 自定义函数的两个必要条件:(1)参数  (2)返回值 自定义函数: 创建自定义函数 CREATE FUNCTION function_name RETURNS {STRING|INTEGER|REAL|DECIMAL} routine_body 关于函数体: 1.函数体可以由合法的SQL语句构成: 2.函数体可以是

SQL 自定义函数(Function)——参数默认值

sql server 自定义函数分为三种类型:标量函数(Scalar Function).内嵌表值函数(Inline Function).多声明表值函数(Multi-Statement Function) 标量函数:标量函数是对单一值操作,返回单一值. 内嵌表值函数:内嵌表值函数的功能相当于一个参数化的视图.它返回的是一个表,内联表值型函数没有由BEGIN-END 语句括起来的函数体. 多声明表值函数:它的返回值是一个表,但它和标量型函数一样有一个用BEGIN-END 语句括起来的函数体,返回值

java mysql自定义函数UDF之调用c函数

正如sqlite可以定义自定义函数,它是通过API定义c函数的,不像其他,如这里的mysql.sqlite提供原生接口就可以方便的调用其他语言的方法,同样的mysql也支持调用其它语言的方法. google "mysql call c function"发现一片文章 MySQL User Defined Functions  This tutorial explains what an User Defined Function (UDF) is, what it does and w