forked from fanspaceshow/CodeTemplate
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathshare_pointer.c
83 lines (65 loc) · 2.23 KB
/
share_pointer.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include <stdio.h>
#include <stdlib.h>
/**
* 共享指针内存管理
*/
// share_pointer是共享指针, 注意*号是在_Cilk_shared之前, 该指针只能指向共享数据
// 共享内存管理应该使用_Offload_shared_malloc(size_t size) 和 _offload_shared_free(void *p)
// 不过在共享函数中可以使用malloc和free为共享指针分配空间, 参见cilk_malloc()
// 另外在mic上不能使用_Offload_shared_free 释放内存, 需要在host上调用, 参见cilk_sharedfree()
//
// int _Cilk_shared *p 是本地指针, 可以指向共享数据, 如果直接p = _Offload_share_malloc() 会报warning
// 而使用下面的方式定义则没有问题
// typedef int *fp;
// _Cilk_shared fp p;
// p = (fp)_Offload_shared_malloc(sizeof(int) * n);
// _Offload_shared_free(p);
int *_Cilk_shared share_pointer;
_Cilk_shared int n = 8;
// 在共享函数内, 使用malloc和free为共享变量分配和释放内存
_Cilk_shared void cilk_malloc() {
int i;
share_pointer = (int *)malloc(sizeof(int) * n);
for(i = 0; i < n; i++) {
share_pointer[i] = i;
}
for(i = 0; i < n; i++) {
printf("cilk_malloc: share_pointer[%d] is %d\n", i, share_pointer[i]);
}
free(share_pointer);
}
// 在mic上执行下面函数会报错
// CARD--ERROR:1 thread:3 myoArenaFree: It is not supported to free shared memory from the MIC side!
_Cilk_shared void cilk_sharedfree() {
int i;
share_pointer = (int *)_Offload_shared_malloc(sizeof(int) * n);
for(i = 0; i < n; i++) {
share_pointer[i] = i;
}
for(i = 0; i < n; i++) {
printf("cilk_sharedfree: share_pointer[%d] is %d\n", i, share_pointer[i]);
}
_Offload_shared_free(share_pointer);
}
_Cilk_shared void cilk_pointer() {
int i;
for(i = 0; i < n; i++) {
share_pointer[i] = i;
}
for(i = 0; i < n; i++) {
printf("cilk_pointer: share_pointer[%d] is %d\n", i, share_pointer[i]);
}
}
int main() {
//_Cilk_offload cilk_malloc();
//_Cilk_offload cilk_sharedfree();
// 下面三条语句执行时会错误
//share_pointer =(int *) malloc(sizeof(int) * n);
//_Cilk_offload cilk_pointer();
//free(share_pointer);
// 下面三条语句可以正常执行
share_pointer = (int *) _Offload_shared_malloc(sizeof(int) * n);
_Cilk_offload cilk_pointer();
_Offload_shared_free(share_pointer);
return 0;
}