#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>
#include<malloc.h>
#include<math.h>
#include<time.h>
__global__ void MyKernel(float *arrSd,float *arrEd,float *arrRd,int n)
{
int idx=blockIdx.x*blockDim.x+threadIdx.x;
extern __shared__ float mid[];
if(idx<n){
mid[idx]=arrSd[idx]-arrEd[idx];
mid[idx]=mid[idx]*mid[idx];
__syncthreads();
if(idx%2==0)
{
mid[idx]=mid[idx]+mid[idx+1];
arrRd[idx/2]=sqrtf(mid[idx]);
}
}
}
int main()
{
clock_t s,e;
s=clock();
int streamSize=256;
float *arrS,*arrE,*arrR;
int n=1024;
int nstreams=n/streamSize;
if(streamSize*nstreams<n)
nstreams+=1;
int size=sizeof(float)*n;
cudaMallocHost((void**)&arrS,size);
cudaMallocHost((void**)&arrE,size);
cudaMallocHost((void**)&arrR,size/2);
float* result=0;
for(int i=0;i!=n;i++)
{
arrS[i]=i+1;
arrE[i]=i;
}
cudaStream_t *stream=(cudaStream_t*)malloc(nstreams*sizeof(cudaStream_t));
for(int i=0;i!=nstreams;++i)
cudaStreamCreate(&stream[i]);
float *arrSd,*arrEd,*arrRd;
cudaMalloc(&arrSd,size);
cudaMalloc(&arrEd,size);
cudaMalloc(&arrRd,size/2);
dim3 threads,blocks;
threads=dim3(64,1);
blocks=dim3(streamSize/threads.x,1);
for(int i=0;i!=nstreams;++i)
{
cudaMemcpyAsync(arrSd+i*streamSize,arrS+i*streamSize,sizeof(float)*streamSize,cudaMemcpyHostToDevice,stream[i]);
cudaMemcpyAsync(arrEd+i*streamSize,arrE+i*streamSize,sizeof(float)*streamSize,cudaMemcpyHostToDevice,stream[i]);
MyKernel<<<blocks,threads,sizeof(float)*streamSize/blocks.x,stream[i]>>>(arrSd+i*n/nstreams,arrEd+i*n/nstreams,arrR+i*n/(nstreams*2),n);
cudaMemcpyAsync(arrR+i*streamSize/2,arrRd+i*streamSize/2,sizeof(float)*streamSize/2,cudaMemcpyDeviceToHost,stream[i]);
}
cudaDeviceSynchronize();
for(int i=0;i!=nstreams;i++)
cudaStreamDestroy(stream[i]);
e=clock();
for(int i=0;i!=n/2;i++)
{
result[i]=arrR[i];
printf("%f ",result[i]);
}
printf("%d",e-s);
cudaFreeHost(arrS);
cudaFreeHost(arrE);
cudaFreeHost(arrR);
cudaFree(arrSd);
cudaFree(arrEd);
cudaFree(arrRd);
int i=0;
scanf("%d",&i);
}
这次我想使用流,编译无错,但是调试出现了异常,还黑屏了一下
具体异常:
cs.exe 中的 0x753db9bc 处最可能的异常: Microsoft C++ 异常: 内存位置 0x002ef930 处的 cudaError_enum。
cs.exe 中的 0x753db9bc 处最可能的异常: Microsoft C++ 异常: 内存位置 0x002ef920 处的 cudaError_enum。
cs.exe 中的 0x753db9bc 处最可能的异常: Microsoft C++ 异常: 内存位置 0x002ef920 处的 cudaError_enum。
cs.exe 中的 0x753db9bc 处最可能的异常: Microsoft C++ 异常: 内存位置 0x002ef920 处的 cudaError_enum。
cs.exe 中的 0x753db9bc 处最可能的异常: Microsoft C++ 异常: 内存位置 0x002ef920 处的 cudaError_enum。
cs.exe 中的 0x00fb2658 处最可能的异常: 0xC0000005: 写入位置 0x00000000 时发生访问冲突
cs.exe 中的 0x775e15ee 处有未经处理的异常: 0xC0000005: 写入位置 0x00000000 时发生访问冲突
程序“[1960] cs.exe: 本机”已退出,返回值为 -1073741819 (0xc0000005)。
不知道该怎么弄。
如果流不能使的话,该怎么隐藏cudaMemcpy()造成的GPU比CPU慢呢?!