最近的工程需要搞一下并行,打算用一下cuda。开这个系列希望能够把这个过程中学到的有关并行的知识以及一些问题。
这一次主要介绍下如何在cuda并行中使用vector,包括空间分配与使用。
vector其实是可以被看做一个动态数组的,其存储的分配也是可以参照动态数组分配的方法,具体方法如下:
内容参考:https://blog.csdn.net/xhz1234/article/details/7462290
一维vector:
vector<int> vec
int *gpu_data; // Device端data
int *cpu_data; // Host端data
int dataWd = 20;
cpu_data = (int*)calloc(dataWd, sizeof(int)); // 申请内存空间
cutilSafeCall( cudaMalloc((void**) &gpu_data, sizeof(int) * dataWd)); // 申请显存空间
cutilSafeCall( cudaMemset(gpu_data, 0, sizeof(float) * dataWd));
for(row = 0; row < dataWd; ++row) { // 给Host端的vector初始化
vec.push_back(row);
}
cutilSafeCall( cudaMemcpy(gpu_data, &vec[0] , sizeof(int) * dataWd, cudaMemcpyHostToDevice)); // 将Host端vector拷贝入Device端data
cutilSafeCall( cudaMemcpy(cpu_data, gpu_data, sizeof(int) * dataWd, cudaMemcpyDeviceToHost)); // 将Device端data拷贝入Host端data
for(row = 0; row < dataWd; ++row) // 打印Host端data
cout << cpu_data[row] << " ";
cout << endl;
cutilSafeCall( cudaFree(gpu_data)); // 释放显存空间
free(cpu_data); // 释放内存空间
二维vector:
vector< vector<int> > vec2D; // Host端vector
int *cpu_data2D; // Host端data
int *gpu_data2D; // Device端data
size_t pitch; // 字节对齐
int Wd = 10; // 宽度
int Ht = 5; // 高度
cutilSafeCall( cudaMallocPitch((void**) &gpu_data2D, &pitch, sizeof(int) * Wd, Ht)); // 申请显存空间
cutilSafeCall( cudaMemset2D(gpu_data2D, pitch, 0, sizeof(int)*Wd, Ht)); // 显存空间初始化
cpu_data2D = (int*)calloc(Wd * Ht, sizeof(int)); // 申请内存空间
if((cpu_data2D == NULL)||(gpu_data2D == NULL)) // 判断空间是否申请成功
{
cout << "Alloc Memery Error" << endl;
return -1;
}
for(row = 0; row < Ht; ++row){// 初始化Vector
vector<int> temp;
for(col = 0; col < Wd; ++col)
{
temp.push_back(row+col);
}
vec2D.push_back(temp);
temp.clear();
}
cout << "Vetor2D" << endl;
for(row = 0; row < Ht; ++row)
{
for(col = 0; col < Wd; ++col){
cout << vec2D[row][col] << " ";
}
cout << endl;
}
// 将vector中的数据拷贝到Device端data
for(row = 0; row < Ht; ++row){
cutilSafeCall( cudaMemcpy(&gpu_data2D[row*(pitch/sizeof(int))], &vec2D[row][0],
sizeof(int)*Wd, cudaMemcpyHostToDevice));
}
// 将Device端data拷贝到Host端data
cutilSafeCall( cudaMemcpy2D( cpu_data2D, sizeof(int) * Wd, gpu_data2D, pitch, sizeof(int) * Wd, Ht, cudaMemcpyDeviceToHost));
cout << "cpu_data2D" << endl; // 打印Host端data
for(row = 0; row < Ht; ++row)
{
for(col = 0; col < Wd; ++col)
{
cout << cpu_data2D[row*Wd + col] << " ";
}
cout << endl;
}
cutilSafeCall( cudaFree(gpu_data2D)); // 释放显存空间
free(cpu_data2D); // 释放内存空间