cuda编程入门示例7

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <cuda_runtime.h>

#define BLOCK_SIZE 16
static void HandleError(cudaError_t err, const char *file, int line)
{
	if (err != cudaSuccess)
	{
		printf("%s in %s at line %d\n", cudaGetErrorString(err), file, line);
		exit(EXIT_FAILURE);
	}
}
#define HANDLE_ERROR( err ) (HandleError( err, __FILE__, __LINE__ ))

#define HANDLE_NULL( a ) {if ((a) == NULL) { \
	printf("Host memory failed in %s at line %d\n", \
	__FILE__, __LINE__); \
	exit(EXIT_FAILURE); }}

static void GenerateNumbers(int *number, int size)
{
	for (int i = 0; i < size; i++)
	{
		number[i] = rand() % 10;
	}
}

static bool InitCUDA()
{
	int count;

	cudaGetDeviceCount(&count);
	if (count == 0)
	{
		fprintf(stderr, "There is no device.\n");
		return false;
	}

	int i;
	for (i = 0; i < count; i++)
	{
		cudaDeviceProp prop;
		if (cudaGetDeviceProperties(&prop, i) == cudaSuccess)
		{
			if (prop.major >= 1)
			{
				break;
			}
		}
	}

	if (i >= count)
	{
		fprintf(stderr, "There is no device supporting CUDA 1.x.\n");
		return false;
	}

	cudaSetDevice(i);

	return true;
}

//1个block,block内256个thread,threadIdx.x = 0的线程计时,每个线程计算一个结果
//最终的结果由threadIdx.x = 0的线程进行累加,临时结果存放在块内共享内存中
__global__ static void sumOfSquares(int *num, int size, int* result, clock_t* time)
{
	extern __shared__ int temp[];
	int sum = 0;
	clock_t start;
	const int tid = threadIdx.x;
	const int gap = (size + blockDim.x - 1) / blockDim.x;
	temp[tid] = 0;

	if (tid == 0)
	{
		start = clock();
	}

	for (int index = tid * gap; index < (tid + 1) * gap; index++)
	{
		if (index < size)
		{
			sum += num[index] * num[index];
		}
	}

	temp[tid] = sum;
	__syncthreads();

	if (tid == 0)
	{
		sum = 0;
		for (int index = 0; index < blockDim.x; index++)
		{
			sum += temp[index];
		}

		*result = sum;
		*time = clock() - start;
	}
}

int main(int argc, char *argv[])
{
	if (!InitCUDA())
	{
		return -1;
	}
	printf("CUDA initialized.\n");

	const int  thread_num = 256;
	const int DATA_SIZE = 1024;
	int data[DATA_SIZE];
	GenerateNumbers(data, DATA_SIZE);

	int* gpudata, *result;
	clock_t* devTime, gpuTime, cpuTime;
	HANDLE_ERROR(cudaMalloc((void **)&gpudata, sizeof(int)* DATA_SIZE));
	HANDLE_ERROR(cudaMalloc((void**)&result, sizeof(int)));
	HANDLE_ERROR(cudaMalloc((void**)&devTime, sizeof(clock_t)));
	HANDLE_ERROR(cudaMemcpy(gpudata, data, sizeof(int)* DATA_SIZE, cudaMemcpyHostToDevice));

	sumOfSquares << <1, 1, thread_num * sizeof(int) >> >(gpudata, DATA_SIZE, result, devTime);

	int sum;
	HANDLE_ERROR(cudaMemcpy(&sum, result, sizeof(int), cudaMemcpyDeviceToHost));
	HANDLE_ERROR(cudaMemcpy(&gpuTime, devTime, sizeof(clock_t), cudaMemcpyDeviceToHost));

	cudaFree(gpudata);
	cudaFree(result);
	cudaFree(devTime);

	printf("sum (GPU): %d, time: %d\n", sum, gpuTime);

	int sumCPU = 0;
	cpuTime = clock();
	for (int i = 0; i < DATA_SIZE; i++)
	{
		sumCPU += data[i] * data[i];
	}
	cpuTime = clock() - cpuTime;
	printf("sum (CPU): %d, time: %d\n", sumCPU, cpuTime);
	printf("Result %s\n", sum == sumCPU ? "OK" : "Wrong");

	//remember to release the device
	cudaDeviceReset();

	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CUDA(Compute Unified Device Architecture)是NVIDIA推出的并行计算平台和API模型,用于利用GPU的计算能力。以下是一个CUDA快速入门代码的示例: 代码示例: #include <cuda_runtime.h> #include <stdio.h> // CUDA核函数,执行在GPU上 __global__ void cudaHelloWorld() { printf("Hello World from GPU!\n"); } int main() { // 调用CUDA异步执行的配置 cudaStream_t stream; cudaStreamCreate(&stream); // 定义核函数的执行配置 dim3 block(1, 1); dim3 grid(1, 1); // 在GPU上调用核函数 cudaHelloWorld<<<grid, block, 0, stream>>>(); // 同步GPU,等待核函数执行完成 cudaStreamSynchronize(stream); // 销毁CUDAcudaStreamDestroy(stream); // 输出CPU上的信息 printf("Hello World from CPU!\n"); return 0; } 该示例代码中,我们在主函数中调用CUDA核函数cudaHelloWorld,并在GPU上并行执行。核函数使用__global__修饰符标记,表明它将在GPU上执行。在主函数中,我们首先使用cudaStreamCreate函数创建一个CUDA流,用于异步执行核函数。然后,我们定义了核函数的执行配置,即指定了需要启动的线程块数量和线程块中的线程数量。在调用核函数时,我们传递了执行配置、流对象和其他参数。接着,我们使用cudaStreamSynchronize函数来等待GPU上的核函数执行完成,以确保输出的正确顺序。最后,我们使用printf函数输出来自CPU和GPU的信息。 这个示例代码展示了如何使用CUDA快速入门,并在GPU上进行并行计算。通过学习和掌握CUDA编程,开发者可以充分利用GPU的并行计算能力,加速各种科学计算和计算密集型任务的执行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值