CUDA编程之vector的存储分配与使用

最近的工程需要搞一下并行,打算用一下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);                         // 释放内存空间

 

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿老甘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值