版主,你好,我看了SDK里的简单流使用后,就想学习一下怎么使用流,就写了下面这个简单的程序,但发现运行有错误,不知道哪里有问题,请版主指教一下,下面代码已经作了简单的注释了。
#include <cuda_runtime.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
typedef unsigned int uint;
typedef unsigned char uchar;
global void init_array(floatin,float factor,uint num)
{
uint tx=blockIdx.xblockDim.x+threadIdx.x;
if(tx<num) //num为数组大小,factor是一个常数,数组中每个元素的值加个一个factor
in[tx]+=factor;
}
int main ()
{
float factor=1.5f; // 加一个常数
uint num=4096; //多少个数据
float h_Data =0; //内存指针
floatgpuresult=0; //结果指针
float *d_Data=0; //显存指针
uint bytes=sizeof(float)*num; //多少字节
int nstreams=4;
cudaStream_t *streams=(cudaStream_t*)malloc(nstreams*sizeof(cudaStream_t));
for(int i=0;i<nstreams;i++) //创建流
cudaStreamCreate(&(streams[i]));
cudaMallocHost((void**)gpuresult,bytes); //开辟内存
cudaMallocHost((void**)h_Data,bytes); //开辟内存
for(uint i=0;i<num;i++)
{
h_Data[i]=(float)i; //初始化数据
}
cudaMalloc((void **) &d_Data,bytes); //开辟显存
for(int i=0;i<nstreams;i++) //拷贝数据过显存
cudaMemcpyAsync(d_Data+i*num/nstreams,h_Data+i*num/nstreams,bytes/nstreams,cudaMemcpyHostToDevice,streams[i]);
dim3 Block(512,1,1);
dim3 Grid(num/(nstreams*Block.x),1,1);
for(int i=0;i<nstreams;i++)
init_array<<<Grid,Block,0, streams[i]>>>(d_Data+i*num/nstreams,factor,num); //执行
for(int i=0;i<nstreams;i++)
cudaMemcpyAsync(gpuresult+i*num/nstreams,d_Data+i*num/nstreams,bytes/nstreams,cudaMemcpyDeviceToHost,streams[i]); //拷贝数据回内存
for(uint i=0;i<10;i++)
printf("%f\n",gpuresult[i]); //输部分数据出来观察结果对不对。
for (int i = 0; i < nstreams; i++)
cudaStreamDestroy(streams[i]); //销毁流
cudaFreeHost(gpuresult);
cudaFree(d_Data);
cudaFreeHost(h_Data);
return 0;
}