再次请教,有关流的问题

#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慢呢?!

(1)“最可能的异常”,这个请无视,这个是中文版的VS debugger的翻译错误。这个实际上“first chance exception",而"first chance exception"后面没有跟随“second chance exception",表明此一场已经被处理了。它会被转换为cuda函数的返回值的。所以可以无视。

(2)因为某个cuda函数将返回出错代码,所以如果你想知道是什么问题,可以检查返回值。(cudaError_t result = cudaDeviceSynchronize();之类的)

(3)除了这个外,您在host上还进行了非法指针访问(0xc0000005), 这个可能是你,也可能是调用的cuda api导致的。你在这里使用了NULL指针。而NULL指针可能是因为前面的其他错误导致的。您用(1)(2)中的说法解决后,(3)中的错误可能会自动消失。

请立刻逐步检查返回值。

以及,做一下无责任猜测,您得到的返回值可能是cudaErrorLaunchTimeout(错误6). 因为您说你看到黑屏了一下。

现在改成这样,没有错误,但是传回的cudaMemcpyAsync()却失败了,ERR信息是cudaErrorUnkown

kernel函数部分没有改动

clock_t s,e;
	s=clock();
	int streamSize=256;
	const int n=1024;	

	float arrS[n],arrE[n],arrR[n/2];	
	const int nstreams=4;	
	int size=sizeof(float)*n;	
	cudaError_t err=cudaSuccess;

	for(int i=0;i!=n;i++)
	{
		arrS[i]=i+1;
		arrE[i]=i;
	}
		
	cudaStream_t stream[nstreams];
	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);

		
		err=cudaMemcpyAsync(arrR+i*streamSize/2,arrRd+i*streamSize/2,sizeof(float)*streamSize/2,cudaMemcpyDeviceToHost,stream[i]);
					
	}
	if(err==cudaSuccess){
	cudaDeviceSynchronize();
	
	for(int i=0;i!=nstreams;i++)
		cudaStreamDestroy(stream[i]);
	e=clock();
	for(int i=0;i!=n/2;i++)
	{
		printf("%f ",arrR[i]);
	}
	
	printf("%d",e-s);
	}
	cudaFreeHost(arrS);
	cudaFreeHost(arrE);
	cudaFreeHost(arrR);
	
	cudaFree(arrSd);
	cudaFree(arrEd);
	cudaFree(arrRd);
	
	int i=0;
	scanf("%d",&i);

自己解决了~ 谢谢版主的指导