- 首页 > it技术 > >
CUDA+Vector测试程序
/*
* Copyright 徐洪志(西北农林科技大学.信息工程学院).All rights reserved.
* Data: 2012-4-15
*/
//
// 此程序是演示了vector型数据如何拷贝入、出显存
#include #include
#include
using namespace std;
///
//
// MAIN
//
///
int main(int argc, char** argv)
{
CUT_DEVICE_INIT(argc, argv);
// 启动CUDA
int row, col;
/// Vector-->Device-->Host1D
cout << "Vector-->Device-->Host 1D" << endl;
vector vec;
// Host端vector
int *gpu_data;
// Device端data
int *cpu_data;
// Host端data
int dataWd = 20;
cpu_data = https://www.it610.com/article/(int*)calloc(dataWd, sizeof(int));
// 申请内存空间
cutilSafeCall( cudaMalloc((void**) &gpu_data, sizeof(int) * dataWd));
// 申请显存空间
cutilSafeCall( cudaMemset(gpu_data, 0, sizeof(float) * dataWd));
if((cpu_data == NULL)||(gpu_data == NULL))// 判断空间是否申请成功
{
cout <<"Alloc Memery Error" << endl;
return -1;
}
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-->Device-->Host2D
cout << "Vector-->Device-->Host 2D" << endl;
vector< vector > 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 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);
// 释放内存空间
CUT_EXIT(argc, argv);
// 退出CUDA
};
推荐阅读