我的第一个CUDA程序
最近在学习CUDA框架,折腾了一个多月终于把CUDA安装完毕,现在终于跑通了自己的一个CUDA的Hello world程序,值得欣喜~
首先,关于CUDA的初始化,代码和解释如下,这部分主要参考GXW的文章:
//init the CUDA device 
bool initCUDA()
{
	int deviceCount;
	cudaGetDeviceCount(&deviceCount);	//Get the CUDA GPU count
	if (deviceCount==0)
	{
		fprintf(stderr, "There is no device.\n");
		return false;
	}
	//判断是否有支持CUDA的装置,如果没有,deviceCount会返回一个1,而device0是一个cuda的仿真装置,而这个仿真的装置是不支持CUDA1.0以上。
	//所以在写程序时候需要判断各个装置支持的版本号,只有在版本号大于1.0
	int i;
	for (i=0;i<deviceCount;i++)		
	{
		cudaDeviceProp prop;
		if (cudaGetDeviceProperties(&prop,i)==cudaSuccess)
		{
			if (prop.major>=1)
			{
				break;
			}
		}
	}
	if (i==deviceCount)
	{
		fprintf(stderr,"There is no device supporting CUDA1.x.\n");
		return false;
	}
	cudaSetDevice(i);
	return true;
}
初始化之后,先说一下程序的总体的思想,在main函数中生命一个字符串“Hello Word!”,然后利用GPU多个线程,分别对这个字符串进行修改。废话不多说,上代码:
__global__ void helloword(char * helloword)
{
	int i= threadIdx.x;  //得到当前线程的id
	helloword[i] = helloword[i]+1;
}
int main(int count, char * args[])
{
	if (!initCUDA())
	{
		return 0;
	}
	printf("CUDA successfully init");
	char * cpu_hello="Hello world!";
	int size= strlen(cpu_hello);
	char* gpu_hello;      
     //为gpu_hello在GPU上面开辟一块空间,cudaMalloc和c里面的函数malloc有些相似,不过cudaMalloc是在GPU上面开辟空间
	cudaMalloc((void**)&gpu_hello,size*sizeof(char));
     //cudaMemcpy主要用于在cpu和GPU之间拷贝数据,前三个参数和c语言里面的memcpy一样,最后一个指定方向的
	cudaMemcpy(gpu_hello,cpu_hello,size*sizeof(char),cudaMemcpyHostToDevice);
	helloword <<<1,size>>>(gpu_hello);
	
	cudaError_t cudaErr=cudaGetLastError();
	if (cudaErr!=cudaSuccess)
	{
		fprintf(stderr,"addKernel failed!");
		return 0;
	}
	
	cudaErr=cudaDeviceSynchronize();
	if (cudaErr!= cudaSuccess)
	{
		fprintf(stderr,"synchronize is wrong");
		return 0;
	}
	char *temp= (char *)malloc(sizeof(char)*(size+1));
	memset(temp,0,size+1);
	cudaErr =cudaMemcpy(temp,gpu_hello,size*sizeof(char),cudaMemcpyDeviceToHost);
	if (cudaErr != cudaSuccess) {
		fprintf(stderr, "cudaMemcpy failed!%s",cudaGetErrorString(cudaErr));
		return 0;
	}
	printf("\n%s\n",temp);
	return 1;
}
调试了好久,这个程序才调通,对于老手来讲可能不算什么,但是对于我这个新手来讲,喜悦之情……呵呵。
路漫漫其修远兮,吾将上下而求索~
                    
                
                
            
        
浙公网安备 33010602011771号