可移動固定記憶體測試

2022-05-01 03:39:09 字數 4189 閱讀 7545

1 #include "

../common/book.h

"2 #include "

cuda_runtime.h

"3 #include "

device_launch_parameters.h

"4 #include "

device_functions.h"5

#define imin(a,b) (a6

7#define n (33*1024*1024)

8const

int threadsperblock = 256;9

const

int blockspergrid =

10 imin(32, (n / 2 + threadsperblock - 1) /threadsperblock);

1112

13 __global__ void dot(int size, float *a, float *b, float *c)

2324

//set the cache values

25 cache[cacheindex] =temp;

2627

//塊內線程同步

28__syncthreads();

2930

//for reductions, threadsperblock must be a power of 2

31//

because of the following code

32int i = blockdim.x / 2;33

while (i != 0

) 39

40if (cacheindex == 0

)41 c[blockidx.x] = cache[0

];42}43

4445

struct

datastruct ;

5354 unsigned winapi routine(void *pvoiddata)

55//

void* routine(void *pvoiddata)

5664

65int size = data->size;

66float *a, *b, c, *partial_c;

67float *dev_a, *dev_b, *dev_partial_c;

6869

//allocate memory on the cpu side

70 a = data->a;

71 b = data->b;

72 partial_c = (float*)malloc(blockspergrid*sizeof(float

));73

74//

allocate the memory on the gpu

75 handle_error(cudahostgetdevicepointer(&dev_a, a, 0

));76 handle_error(cudahostgetdevicepointer(&dev_b, b, 0

));77 handle_error(cudamalloc((void**)&dev_partial_c,

78 blockspergrid*sizeof(float

)));

7980

//offset 'a' and 'b' to where this gpu is gets it data

81 dev_a += data->offset;

82 dev_b += data->offset;

8384 dot << > >(size, dev_a, dev_b,

85dev_partial_c);

86//

copy the array 'c' back from the gpu to the cpu

87handle_error(cudamemcpy(partial_c, dev_partial_c,

88 blockspergrid*sizeof(float

),89

cudamemcpydevicetohost));

9091

//finish up on the cpu side

92 c = 0;93

for (int i = 0; i)

9697

handle_error(cudafree(dev_partial_c));

9899

//free memory on the cpu side

100free(partial_c);

101102 data->returnvalue =c;

103return0;

104}

105106

107int main(void

) 115

116cudadeviceprop prop;

117for (int i = 0; i<2; i++)

123}

124125

float *a, *b;

126 handle_error(cudasetdevice(0

));127

handle_error(cudasetdeviceflags(cudadevicemaphost));

128/*

129在設定了裝置0後,設定了分配記憶體的型別為cudahostallocportable,

130否則只有裝置0會將這些分配的記憶體視為固定記憶體

131只在device0中設定為可移動的

132*/

133 handle_error(cudahostalloc((void**)&a, n*sizeof(float

),134 cudahostallocwritecombined |

135 cudahostallocportable |

136137 handle_error(cudahostalloc((void**)&b, n*sizeof(float

),138 cudahostallocwritecombined |

139 cudahostallocportable |

140141

142//

fill in the host memory with data

143for (int i = 0; i)

147148

//prepare for multithread

149 datastruct data[2

];150 data[0].deviceid = 0

;151 data[0].offset = 0

;152 data[0].size = n / 2

;153 data[0].a =a;

154 data[0].b =b;

155156 data[1].deviceid = 1

;157 data[1].offset = n / 2

;158 data[1].size = n / 2

;159 data[1].a =a;

160 data[1].b =b;

161162 cutthread thread = start_thread(routine, &(data[1

]));

163 routine(&(data[0

]));

164end_thread(thread);

165166

167//

free memory on the cpu side

168handle_error(cudafreehost(a));

169handle_error(cudafreehost(b));

170171 printf("

value calculated: %f\n",

172 data[0].returnvalue + data[1

].returnvalue);

173174

return0;

175 }

可移動構造 可複製構造 可移動賦值 可複製賦值

記錄一下這幾個容易混淆的概念。可移動構造 moveconstructible 指定該型別的例項可以從乙個右值實參構造 定義 給定 下列表示式必須合法且擁有指定的效果 t u rv u 的值等於 rv 在初始化前的值。rv 的新值未指明。t rv t rv 的值等於 rv 在初始化前的值。rv 的新值...

美國C Spire測試5G固定和移動技術

據悉,美國地區運營商c spire日前宣布,公司打算支援更快速度 更低延遲服務,希望通過滿足使用者和市場需求從而成倍增加網際網路連線裝置。通過使用諾基亞裝置,c spire在密西西比洲成功演示了5g固定無線解決方案技術,也是業界首個。此次演示是通過直接連線到其光纖電視服務完成的。由於只有少數美國電信...

移動端固定位置

相信大家在移動開發的時候,都會遇到乙個 固定 的問題。那就是什麼頭部固定在螢幕頂部啊 什麼尾部固定在螢幕的尾部啊這些鬼東西。或者你現在看到這裡會想到 這還不簡單嗎?直接用個position fixed不就搞好了嗎,那麼菜還來寫文章。或者你沒想到,雖然position fixed是可以固定位置,但是在...