码迷,mamicode.com
首页 > 其他好文 > 详细

OpenACC 简单的直方图

时间:2018-08-03 22:36:15      阅读:228      评论:0      收藏:0      [点我收藏+]

标签:dos   work   RKE   ret   exe   worker   const   turn   open   

? 简单的直方图,强调原子操作的使用

● 代码

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <openacc.h>
 4 
 5 int main()
 6 {
 7     const int length = 1024, basket = 10;
 8     int data[length], histgram[basket];
 9 
10     srand(97);
11     for (int i = 0; i < basket; histgram[i++] = 0);
12     for (int i = 0; i < length; data[i++] = rand() % 10);
13 
14 #pragma acc parallel loop
15     for (int i = 0; i < length; i++)
16     {
17 #pragma acc atomic update
18         histgram[data[i]]+=1;
19     }
20 
21     for (int i = 0; i < basket; i++)
22         printf("histgram[%d] = %d\n", i, histgram[i]);
23 
24     getchar();
25     return 0;
26 }

● 输出结果,在 Windows 里是错的,在 WSL 里是对的

D:\Code\OpenACC\OpenACCProject\OpenACCProject>pgcc -acc -Minfo main.c -o main_acc.exe
main:
     14, Accelerator kernel generated
         Generating Tesla code
         15, #pragma acc loop gang, vector(128) /* blockIdx.x threadIdx.x */
     14, Generating implicit copyout(histgram[data])
         Generating implicit copyin(data[:1024])

D:\Code\OpenACC\OpenACCProject\OpenACCProject>main_acc.exe
launch CUDA kernel  file=D:\Code\OpenACC\OpenACCProject\OpenACCProject\main.c function=main line=14 device=0 threadid=1 num_gangs=8 num_workers=1 vector_length=128 grid=8 block=128
histgram[0] = 0
histgram[1] = 0
histgram[2] = 0
histgram[3] = 0
histgram[4] = 0
histgram[5] = 100
histgram[6] = 0
histgram[7] = 0
histgram[8] = 0
histgram[9] = 0
cuan@CUAN:/mnt/d/Code/OpenACC/OpenACCProject/OpenACCProject$ pgcc -acc -Minfo main.c -o main_acc_ubuntu.exe
main:
     14, Accelerator kernel generated
         Generating Tesla code
         15, #pragma acc loop gang, vector(128) /* blockIdx.x threadIdx.x */
     14, Generating implicit copyout(histgram[data])
         Generating implicit copyin(data[:1024])
cuan@CUAN:/mnt/d/Code/OpenACC/OpenACCProject/OpenACCProject$ ./main_acc_ubuntu.exe
histgram[0] = 123
histgram[1] = 79
histgram[2] = 90
histgram[3] = 109
histgram[4] = 102
histgram[5] = 96
histgram[6] = 117
histgram[7] = 104
histgram[8] = 110
histgram[9] = 94

● 更新!!!把代码改了一下,在 Windos 下也正确了,还是简单语句的问题

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <openacc.h>
 4 
 5 int main()
 6 {
 7     const int length = 1024, basket = 10;
 8     int data[length], histgram[basket];
 9 
10     srand(97);
11     for (int i = 0; i < basket; histgram[i++] = 0);
12     for (int i = 0; i < length; data[i++] = rand() % 10);
13 
14     int temp;               // 新定义一个变量
15 #pragma acc parallel loop
16     for (int i = 0; i < length; i++)
17     {
18         temp = data[i];     // 原子操作之前先取地址
19 #pragma acc atomic update
20         histgram[temp] += 1;// 使用 temp 作为下标
21     }
22 
23     for (int i = 0; i < basket; i++)
24         printf("histgram[%d] = %d\n", i, histgram[i]);
25 
26     getchar();
27     return 0;
28 }

 

OpenACC 简单的直方图

标签:dos   work   RKE   ret   exe   worker   const   turn   open   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!