zoukankan      html  css  js  c++  java
  • OpenACC 简单的直方图

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

    ● 代码

     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
    ", i, histgram[i]);
    23 
    24     getchar();
    25     return 0;
    26 }

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

    D:CodeOpenACCOpenACCProjectOpenACCProject>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:CodeOpenACCOpenACCProjectOpenACCProject>main_acc.exe
    launch CUDA kernel  file=D:CodeOpenACCOpenACCProjectOpenACCProjectmain.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

    ● 添加一个中间变量用来存储 data[i],在 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
    ", i, histgram[i]);
    25 
    26     getchar();
    27     return 0;
    28 }
  • 相关阅读:
    Python判断操作系统类型
    Linux之计划任务
    java web 之 WebRoot和WebContent目录
    天坑 之 java web servlet+jsp项目 配置后 404 (MyEclipse转eclipse)
    MyEclipse开发的java web项目在 Eclipse中无法识别
    Tomcat 改BUG之 localhost:8080 404
    (重要) html概念之 input:name与id详解
    html基础之 input:type
    BeanUtils 以及BeanUtils.populate使用
    bootstrap 之 列表组件使用
  • 原文地址:https://www.cnblogs.com/cuancuancuanhao/p/9416385.html
Copyright © 2011-2022 走看看