前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【MIC学习笔记】in/out/inout详细用法

【MIC学习笔记】in/out/inout详细用法

作者头像
零式的天空
发布于 2022-03-02 09:02:23
发布于 2022-03-02 09:02:23
81000
代码可运行
举报
文章被收录于专栏:零域Blog零域Blog
运行总次数:0
代码可运行

下面的代码主要使用in作为测试, out和inout的用法应该是类似的, 下面主要以代码为主, 并且附带执行结果。

静态一维数组

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#include <stdlib.h>

void offload_one_dim_array(int n) {
    int arr[n];
    int arr2[n];
    int arr3[n];
    int i;
    
    for(i = 0; i < n; i++) {
        arr[i] = i;
        arr2[i] = n + i;
        arr3[i] = 2 * n + i;
    }
    
    //上传arr的全部元素,上传arr2的前0-4共5(长度为5)个元素,上传arr3的从索引2开始的5个元素(即索引2-6)到mic上
    #pragma offload target(mic) in(arr) in(arr2:length(5)) in(arr3[1:5])
    {
        for(i = 0; i < n; i++) {
            printf(" arr[%d] is %d\n", i, arr[i]);
        }
        
        printf("==========================\n");
        
        for(i = 0; i < n; i++) {
            printf("arr2[%d] is %d\n", i, arr2[i]);
        }
        
        printf("==========================\n");
        
        for(i = 0; i < n; i++) {
            printf("arr3[%d] is %d\n", i, arr3[i]);
        }
    }
}

int main() {
    offload_one_dim_array(10);
    return 0;
}

输出结果为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 arr[0] is 0
 arr[1] is 1
 arr[2] is 2
 arr[3] is 3
 arr[4] is 4
 arr[5] is 5
 arr[6] is 6
 arr[7] is 7
 arr[8] is 8
 arr[9] is 9
==========================
arr2[0] is 10
arr2[1] is 11
arr2[2] is 12
arr2[3] is 13
arr2[4] is 14
arr2[5] is 0
arr2[6] is 0
arr2[7] is 0
arr2[8] is 0
arr2[9] is 0
==========================
arr3[0] is 0
arr3[1] is 0
arr3[2] is 22
arr3[3] is 23
arr3[4] is 24
arr3[5] is 25
arr3[6] is 26
arr3[7] is 0
arr3[8] is 0
arr3[9] is 0

静态二维数组

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#include <stdlib.h>

void offload_two_dim_array(int n) {
    int arr[n][n];
    int arr2[n][n];
    int arr3[n][n];
    int arr4[n][n];
    int i, j, index = 0;
    for(i = 0; i < n; i++) {
        for(j = 0; j < n; j++) {
            arr[i][j] = index;
            arr2[i][j] = n * n + index;
            arr3[i][j] = 2 * n * n + index;
            arr4[i][j] = 3 * n * n + index;
            index++;
        }
    }
    
    //上传arr的全部值,上传arr2的前5个值(整体看为长度为n*n的一维数组,取前5个值),上传arr3中[0-1][0-(n-1)]的值,
    //不加后面的y的维度,默认y的是1-(n-1), 上传arr4中[0-1][0-1]的值
    #pragma offload target(mic) in(arr) in(arr2:length(5)) in(arr3[0:2]) in(arr4[0:2][0:2])
    {
        for(i = 0; i < n; i++) {
            for(j = 0; j < n; j++) {
                printf(" arr[%d][%d] is %d\n", i, j, arr[i][j]);
            }
        }
        
        printf("==========================\n");
        
        for(i = 0; i < n; i++) {
            for(j = 0; j < n; j++) {
                printf("arr2[%d][%d] is %d\n", i, j, arr2[i][j]);
            }
        }
        
        printf("==========================\n");
        
        for(i = 0; i < n; i++) {
            for(j = 0; j < n; j++) {
                printf("arr3[%d][%d] is %d\n", i, j,  arr3[i][j]);
            }
        }
        
        printf("==========================\n");
        
        for(i = 0; i < n; i++) {
            for(j = 0; j < n; j++) {
                printf("arr4[%d][%d] is %d\n", i, j, arr4[i][j]);
            }
        }
    }
}

int main() {
    offload_two_dim_array(3);
    return 0;
}

下面是输出结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 arr[0][0] is 0
 arr[0][1] is 1
 arr[0][2] is 2
 arr[1][0] is 3
 arr[1][1] is 4
 arr[1][2] is 5
 arr[2][0] is 6
 arr[2][1] is 7
 arr[2][2] is 8
==========================
arr2[0][0] is 9
arr2[0][1] is 10
arr2[0][2] is 11
arr2[1][0] is 12
arr2[1][1] is 13
arr2[1][2] is 0
arr2[2][0] is 0
arr2[2][1] is 0
arr2[2][2] is 0
==========================
arr3[0][0] is 18
arr3[0][1] is 19
arr3[0][2] is 20
arr3[1][0] is 21
arr3[1][1] is 22
arr3[1][2] is 23
arr3[2][0] is 0
arr3[2][1] is 0
arr3[2][2] is 0
==========================
arr4[0][0] is 27
arr4[0][1] is 28
arr4[0][2] is 0
arr4[1][0] is 30
arr4[1][1] is 31
arr4[1][2] is 0
arr4[2][0] is 0
arr4[2][1] is 0
arr4[2][2] is 0

一个小问题

当数组(非指针)被offload一次之后会在mic上保存,并没有立即释放,在同一个作用域下,再次offload时, 如果值改变会更改为新值,如果没有offload某些位置的值,这些位置会使用上一次的旧值 下面是局部变量测试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#include <stdlib.h>

void offload_array_test(int n) {
    int arr[n];
    int i;
    for(i = 0; i < n; i++) {
        arr[i] = i;
    }
    
    #pragma offload target(mic) in(arr)
    {
        for(i = 0; i < n; i++) {
            printf("arr[%d] in first offload is %d\n", i,  arr[i]);
        }
        // 这里修改了并没有传回到CPU上, 但是会保存在MIC上
        arr[9] = 1111;
        printf("==========================\n");
    }
    
    arr[1] = 1000;
    arr[8] = 2000;
    
    //这次的offload只上传了0-2共3个值,mic上arr[1]的值会更改为1000,arr[3-(n-1)]的值会使用MIC上保存的值, 注意arr[9]的值
    #pragma offload target(mic) in(arr:length(3))
    {
        for(i = 0; i < n; i++) {
            printf("arr[%d] in second offload is %d\n",i, arr[i]);
        }
    }
    
    for(i = 0; i < n; i++) {
        printf("arr[%d] without offload is %d\n",i, arr[i]);
    }
    printf("==========================\n");
}

int main() {
    offload_array_test(10);
    return 0;
}

输出结果为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
arr[0] without offload is 0
arr[1] without offload is 1000
arr[2] without offload is 2
arr[3] without offload is 3
arr[4] without offload is 4
arr[5] without offload is 5
arr[6] without offload is 6
arr[7] without offload is 7
arr[8] without offload is 2000
arr[9] without offload is 9
==========================
arr[0] in first offload is 0
arr[1] in first offload is 1
arr[2] in first offload is 2
arr[3] in first offload is 3
arr[4] in first offload is 4
arr[5] in first offload is 5
arr[6] in first offload is 6
arr[7] in first offload is 7
arr[8] in first offload is 8
arr[9] in first offload is 9
==========================
arr[0] in second offload is 0
arr[1] in second offload is 1000
arr[2] in second offload is 2
arr[3] in second offload is 3
arr[4] in second offload is 4
arr[5] in second offload is 5
arr[6] in second offload is 6
arr[7] in second offload is 7
arr[8] in second offload is 8
arr[9] in second offload is 1111

下面是全局变量测试:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#include <stdlib.h>

#define __ONMIC__ __attribute__((target(mic)))

__ONMIC__ int gArr[10];

void test1() {
    
    int i;
    
    for(i = 0; i < 10; i++) {
        gArr[i] = i;
    }
    #pragma offload target(mic)
    {
        for(i = 0; i < 10; i++) {
            printf("gArr[%d] in test1 is %d\n", i, gArr[i]);
        }
        printf("==========================\n");
    }
}
void test2() {
    gArr[0] = 10;
    gArr[5] = 10;
    int i;
    #pragma offload target(mic) in(gArr[0:2])
    {
        for(i = 0; i < 10; i++) {
            printf("gArr[%d] in test2 is %d\n", i, gArr[i]);
        }
    }
}

int main() {
    test1();
    test2();
    return 0;
}

下面是测试结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gArr[0] in test1 is 0
gArr[1] in test1 is 1
gArr[2] in test1 is 2
gArr[3] in test1 is 3
gArr[4] in test1 is 4
gArr[5] in test1 is 5
gArr[6] in test1 is 6
gArr[7] in test1 is 7
gArr[8] in test1 is 8
gArr[9] in test1 is 9
==========================
gArr[0] in test2 is 10
gArr[1] in test2 is 1
gArr[2] in test2 is 2
gArr[3] in test2 is 3
gArr[4] in test2 is 4
gArr[5] in test2 is 5
gArr[6] in test2 is 6
gArr[7] in test2 is 7
gArr[8] in test2 is 8
gArr[9] in test2 is 9

一维动态数组

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#include <stdlib.h>

void offload_point() {
    int n = 10;
    int *arr =(int*) calloc(n, sizeof(int));
    int *arr2 = (int*) calloc(n, sizeof(int));
    int *arr3 = (int*) calloc(n, sizeof(int));
    int i;
    
    for(i = 0; i < n; i++) {
        arr[i] = i;
        arr2[i] = n + i;
        arr3[i] = n * 2 + i;
    }
    
    //需要注意:上传指针定义的数组时 1:要指定length或者[start:length]属性 2:要显示用in
    #pragma offload target(mic) in(arr:length(n)) in (arr2[2:3]) in (arr3:length(3))
    {
        for(i = 0; i < n; i++) {
            printf(" arr[%d] is  %d\n",i, arr[i]);
        }
        
        printf("==========================\n");
        
        for(i = 0; i < n; i++) {
            printf("arr2[%d] is %d \n",i, arr2[i]);
        }
        
        printf("==========================\n");
        
        for(i = 0; i < n; i++) {
            printf("arr3[%d] is %d \n", i, arr3[i]);
        }
    }
    
    free(arr);
    free(arr2);
    free(arr3);
}

int main() {
    offload_point();
    return 0;
}

程序输出如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 arr[0] is  0
 arr[1] is  1
 arr[2] is  2
 arr[3] is  3
 arr[4] is  4
 arr[5] is  5
 arr[6] is  6
 arr[7] is  7
 arr[8] is  8
 arr[9] is  9
==========================
arr2[0] is 0 
arr2[1] is 0 
arr2[2] is 12 
arr2[3] is 13 
arr2[4] is 14 
arr2[5] is 0 
arr2[6] is 0 
arr2[7] is 0 
arr2[8] is 0 
arr2[9] is 0 
==========================
arr3[0] is 20 
arr3[1] is 21 
arr3[2] is 22 
arr3[3] is 0 
arr3[4] is 0 
arr3[5] is 0 
arr3[6] is 0 
arr3[7] is 0 
arr3[8] is 0 
arr3[9] is 0 

使用指针实现的二维数组

首先用typedef定义一个一维静态数组的类型, 然后为该类型声明一个动态数组

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#include <stdlib.h>

typedef int ARRAY[5];

//下面相当于上传了一个二维数组
void offload_point2() {
    int n = 3;
    ARRAY *arr = (ARRAY*)calloc(n, sizeof(ARRAY));
    ARRAY *arr2 = (ARRAY*)calloc(n, sizeof(ARRAY));
    int i, j, index = 0;
    for(i = 0; i < n; i++) {
        for(j = 0; j < 5; j++) {
            arr[i][j] = index;
            arr2[i][j] = n *n + index;
            index++;
        }
    }
    
    #pragma offload target(mic) in(arr:length(n))  in (arr2[0:2][0:2])
    {
        for(i = 0; i < n; i++) {
            for(j = 0; j < 5; j++) {
                printf(" arr[%d][%d] is %d \n", i, j , arr[i][j]);
            }
        }
        
        printf("==========================\n");
        
        for(i = 0; i < n; i++) {
            for(j = 0; j < 5; j++) {
                printf("arr2[%d][%d] is %d \n", i, j , arr2[i][j]);
            }
        }
    }
    
    free(arr);
    free(arr2);
}

int main() {
    offload_point2();
    return 0;
}

输出结果为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 arr[0][0] is 0 
 arr[0][1] is 1 
 arr[0][2] is 2 
 arr[0][3] is 3 
 arr[0][4] is 4 
 arr[1][0] is 5 
 arr[1][1] is 6 
 arr[1][2] is 7 
 arr[1][3] is 8 
 arr[1][4] is 9 
 arr[2][0] is 10 
 arr[2][1] is 11 
 arr[2][2] is 12 
 arr[2][3] is 13 
 arr[2][4] is 14 
==========================
arr2[0][0] is 9 
arr2[0][1] is 10 
arr2[0][2] is 0 
arr2[0][3] is 0 
arr2[0][4] is 0 
arr2[1][0] is 14 
arr2[1][1] is 15 
arr2[1][2] is 0 
arr2[1][3] is 0 
arr2[1][4] is 0 
arr2[2][0] is 0 
arr2[2][1] is 0 
arr2[2][2] is 0 
arr2[2][3] is 0 
arr2[2][4] is 0 

包含指针的struct

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#include <stdlib.h>

struct my_struct {
    int y;
    int *a;
};

void offload_struct() {
    struct my_struct m;
    m.y = 10;
    m.a =(int*) calloc(10, sizeof(int));
    
    int i;
    for(i=0; i < 10; i++) {
        m.a[i] = i;
    }
    
    //struct中有指针变量时要单独传指针变量
    #pragma offload target(mic) in(m) in(m.a:length(10))
    {
        printf("offload_struct: the struct.y is %d\n", m.y);
        printf("offload_struct: the struct.a is %d\n", m.a[1]);
    }
    free(m.a);
}

int main() {
    offload_struct();
    return 0;
}

注意事项

使用offload不能上传指针数组, 即一个数组中的每个元素是一个指针, 或者元素中包含一个指针, 比如下面的形式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int **p


struct mystruct {
    int *i;
};

struct mystruct *m;
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015-11-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
一键备份微博并导出生成PDF,顺便用Python分析微博账号数据
这里再分享下如何快速导出你的所有微博数据,然后用Python分析某个微博账号的数据,比如高赞,转发,评论微博,微博词云,微博发布时间轴,以及使用的手机。
苏生不惑
2020/06/04
8.7K2
一次性搞定微博,苏生不惑又写了个脚本
之前分享过很多微博相关的脚本和工具一键批量下微博内容/图片/视频,获取博主最受欢迎微博,图片查找微博博主,今天再整理下,一次性搞定微博。
苏生不惑
2023/11/16
1.2K0
一次性搞定微博,苏生不惑又写了个脚本
我又写了个好玩的工具
之前文章微博/公众号/抖音等各大平台都显示 ip 归属地了,能改吗? 我用代码统计了下公众号留言区的地区分布情况,广东的小伙伴最多:
苏生不惑
2022/05/30
5060
我又写了个好玩的工具
围观微博网友发起的美胸比赛学习爬取微博评论内容
继上次知乎话题 拥有一副好身材是怎样的体验? 解析了知乎回答内容之后,这次我们来解析一下微博内容,以微博网友发起的美胸大赛为例:
爱写bug
2019/07/15
1.7K0
围观微博网友发起的美胸大赛
继上次知乎话题 拥有一副好身材是怎样的体验? 解析了知乎回答内容之后,这次我们来解析一下微博内容,以微博网友发起的美胸大赛为例:
爱写bug
2019/08/01
6.9K0
围观微博网友发起的美胸大赛
再谈备份微博
除了使用稳部落和Python来备份微博,这里再分享个好用的Chrome扩展 Octoman 。
苏生不惑
2020/07/21
1.8K0
再谈备份微博
文章马伊琍离婚后微博评论太多了...用代码来解决吧
上周末文章同学的一条微博:“吾愛伊琍,同行半路,一别两宽,餘生漫漫,依然親情守候.”
Python编程与实战
2019/12/04
4020
Python 爬取“工商秘密”微博后,我做了这个“可视化大屏”(附gif图)
微博作为我的日常软件之一,平时除了看看热搜、肖战(哈哈),我还会时不时看看秘密,虽然从来都没有投过稿,但还是会对一些感兴趣的内容评论评论或者点点赞,前两天刷秘密突然很想知道,
数据森麟
2021/03/09
6770
Python 爬取“工商秘密”微博后,我做了这个“可视化大屏”(附gif图)
基于Java爬取微博数据(五) 补充微博正文列表图片 or 视频 内容
在通过对微博正文内容中的图片 or 视频内容进行分析后,图片 or 视频 链接是可以直接通过 Java 代码下载或者转存的,那么这样就可以补充我们在 【基于Java爬取微博数据(一) 微博主页正文列表数据】 时缺失的图片 or 视频信息了,当然,如果你的需求并不需要转存微博正文列表内容中的图片 or 视频的话,那么你就无需进行下面的操作了。在开始进行微博主页正文列表数据 补充 图片 or 视频内容之前,先来分析一下获取到的微博正文列表数据的内容。
六月的雨在Tencent
2024/09/25
2870
微博爬虫综述、错误汇总、Q&A
微博爬虫主要有两个导向,一个是微博内容的爬虫,其目的字段包括微博文本、发布者、转发/评论/点赞数等,另一个是微博评论的爬虫,其目的字段主要是评论文本和评论者。
月小水长
2020/03/19
1.5K0
微博爬虫综述、错误汇总、Q&A
用Python对鹿晗、关晓彤微博进行情感分析
專 欄 ❈大吉大利小米酱,Python中文社区专栏作者,Python爱好者,顽强地自学中,18线灵魂画手/段子手/脑洞女王。 简书: http://www.jianshu.com/u/8e45f2f3b6c1 知乎: https://www.zhihu.com/people/otakurice ❈ 前言:本文主要涉及知识点包括新浪微博爬虫、python对数据库的简单读写、简单的列表数据去重、简单的自然语言处理(snowNLP模块、机器学习)。适合有一定编程基础,并对python有所了解的盆友阅读。 相
Python中文社区
2018/02/01
1.4K0
用Python对鹿晗、关晓彤微博进行情感分析
分享几个有趣实用的冷知识,涨知识了
之前详细介绍过身份证号码的由来身份证号码的秘密 ,号码最后一位Ⅹ表示罗马数字10,读作shí。
苏生不惑
2023/02/06
7650
微博的力量为什么这么大?
最近听闻「杨超越杯编程大赛」很是火热~ 网友纷纷评论,原来追星还可以这么硬核,没点实力还不敢追了。 本期,小F通过爬取新浪微博评论,来看看大家对此次大赛有什么看法。 在此之前,先查阅一下相关资料,发现从微博的手机端和移动端入手,效果还可以。 网页版的微博,想都不用想,去了就是自讨苦吃。 微博的反爬甚是厉害,我可不想去大动干戈... 虽然最后由于种种原因,还是没能够获取到完整的评论,不过也拿到了挺多数据。 还是可以拿来一窥的。 / 01 / 网页分析 网页端微博直接不看,先看一下手机端。 网址为 https:
龙哥
2019/04/25
8690
微博的力量为什么这么大?
Python采集微博热评进行情感分析祝你狗年脱单
如果自己需要爬(cai)虫(ji)的数据量比较大,为了防止被网站封Ip,可以分时段爬取,另外对于爬到的数据一般是用来存储数据库,这就需要对数据进行去重处理,记录上次爬取的状态,就可以实现在爬虫中断后,可以快速继续上次的状态,实现增量爬取,这里可以参考我之前写过的一个新闻采集,增量采集新闻数据,本文写的对新浪微博的数据采集和处理完整代码在我的Github。 玩微博的人大多数应该知道微博搞笑排行榜的,刚好写这篇文之前看到榜姐1月8号0点话题是一人说一个,追女孩的小道理,感觉这个话题简直是对广大单身男性的福利啊,ヾ(✿゚゚)ノ,故有了何不就采集一下评论来分析一波的想法。
Python攻城狮
2018/08/23
7120
Python采集微博热评进行情感分析祝你狗年脱单
一键批量下载微信公众号文章内容/图片/封面/视频/音频,支持导出html和pdf格式,包含阅读数/点赞数/在看数
之前分享过听说公众号深圳卫健委被网友投诉尺度大,我抓取了所有文章标题和阅读数分析了下 ,后来发现这个号的封面图真有意思,于是批量下载了所有封面图,如果有需要在公众号后台对话框回复 封面 获取所有封面图的网盘地址。
苏生不惑
2021/12/28
4.5K1
一键批量下载微信公众号文章内容/图片/封面/视频/音频,支持导出html和pdf格式,包含阅读数/点赞数/在看数
微博爬虫,python微博用户主页小姐姐图片内容采集爬虫
python爬虫,微博爬虫,需要知晓微博用户id号,能够通过抓取微博用户主页内容来获取用户发表的内容,时间,点赞数,转发数等数据,当然以上都是本渣渣结合网上代码抄抄改改获取的!
二爷
2020/12/11
1.2K0
微博爬虫,python微博用户主页小姐姐图片内容采集爬虫
【爬虫+数据清洗+可视化】“淄博烧烤”热评Python舆情分析大屏
自从2023.3月以来,"淄博烧烤"现象持续占领热搜流量,体现了后疫情时代众多网友对人间烟火气的美好向往,本现象级事件存在一定的数据分析实践意义。
马哥python说
2024/04/06
6790
【爬虫+数据清洗+可视化】“淄博烧烤”热评Python舆情分析大屏
为了知道胡歌粉丝的男女比率,爬了三百万微博数据
、最近偶然间看到一条新闻,标题是:“胡歌作为一个男性明星,男粉丝比女粉丝还多,这不科学!”
小歪
2018/07/25
1.9K0
为了知道胡歌粉丝的男女比率,爬了三百万微博数据
昨晚中国女足绝地大逆转,爬取了微博评论区,评论很精彩
昨晚,女足16年后重夺亚洲杯,决赛落后两球,依然能保持对比赛的观察和思考,下半场从容调度人手,最后完成逆转。
润森
2022/09/22
3990
昨晚中国女足绝地大逆转,爬取了微博评论区,评论很精彩
微博(APP)榜单爬虫及数据可视化
首先对部分用户id进行可视化,字体大一点的是上榜2次的(这次统计中最多上榜的是2次)。
罗罗攀
2018/08/28
1.1K0
微博(APP)榜单爬虫及数据可视化
推荐阅读
相关推荐
一键备份微博并导出生成PDF,顺便用Python分析微博账号数据
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档