cuda ,常量内存使用

<img src="data:image/png;base64,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" alt="" />
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <iostream>
#include <stdio.h>
#include "assert.h"
#include "conio.h"
using namespace std;

#define CUDA_CALL(x){const cudaError_t a=(x);if(a!=cudaSuccess){printf("\nCUDAError:%s(err_num= %d) \n",cudaGetErrorString(a),a);cudaDeviceReset();assert(0);}}
#define KERNEL_LOOP 65536
__constant__ static const int const_data_01 = 0x55555555;
__constant__ static const int const_data_02 = 0x77777777;
__constant__ static const int const_data_03 = 0x33333333;
__constant__ static const int const_data_04 = 0x11111111;
__global__ void const_test_gpu_literal(int * const data, const int num_elements)
{
	const int tid = (blockDim.x*blockIdx.x) + threadIdx.x;
	if (tid < num_elements)
	{
		int d = 0x55555555;
		for (int i = 0; i < KERNEL_LOOP; i++)
		{
			d ^= 0x55555555;
			d |= 0x77777777;
			d &= 0x33333333;
			d |= 0x11111111;
		}
		data[tid] = d;
	}
}
__global__ void const_test_gpu_const(int * const data, const int num_elements)
{
	const int tid = (blockDim.x*blockIdx.x) + threadIdx.x;
	if (tid < num_elements)
	{
		int d = const_data_01;
		for (int i = 0; i < KERNEL_LOOP; i++)
		{
			d ^= const_data_01;
			d |= const_data_02;
			d &= const_data_03;
			d |= const_data_04;
		}
		data[tid] = d;
	}
}
__host__ void wait_exit(void)
{
	char ch;
	printf("\nPress any key to exit");
	ch = getch();
}
__host__ void cuda_error_check(
	const char * prefix,
	const char * postfix)
{
	if (cudaPeekAtLastError() != cudaSuccess)
	{
		printf("\n%s%s%s", prefix, cudaGetErrorString(cudaGetLastError()), postfix);
		cudaDeviceReset();
		wait_exit();
		exit(1);
	}
}
__host__ void gpu_kernel(void)
{
	const int num_elements = (128 * 1024);
	const int num_threads = 256;
	const int num_blocks = (num_elements + (num_threads - 1)) / num_threads;
	const int num_bytes = num_elements*sizeof(int);
	int max_device_num;
	const int max_runs = 6;
	CUDA_CALL(cudaGetDeviceCount(&max_device_num));
	for (int device_num = 0; device_num < max_device_num; device_num++)
	{
		CUDA_CALL(cudaSetDevice(device_num));
		for (int num_test = 0; num_test < max_runs; num_test++)
		{
			int *data_gpu;
			cudaEvent_t kernel_start1, kernel_stop1;
			cudaEvent_t kernel_start2, kernel_stop2;
			float delta_time1 = 0.0F, delta_time2 = 0.0F;
			struct cudaDeviceProp device_prop;
			char device_prefix[261];

			CUDA_CALL(cudaMalloc(&data_gpu, num_bytes));
			CUDA_CALL(cudaEventCreate(&kernel_start1));
			CUDA_CALL(cudaEventCreate(&kernel_start2));
			CUDA_CALL(cudaEventCreateWithFlags(&kernel_stop1, cudaEventBlockingSync));
			CUDA_CALL(cudaEventCreateWithFlags(&kernel_stop2, cudaEventBlockingSync));

			CUDA_CALL(cudaGetDeviceProperties(&device_prop, device_num));
			sprintf(device_prefix, "ID:%d %s:", device_num, device_prop.name);

			const_test_gpu_literal << <num_blocks, num_threads >> >(data_gpu, num_elements);
			cuda_error_check("Error ", "return from literal starup kernel");
			CUDA_CALL(cudaEventRecord(kernel_start1, 0));

			const_test_gpu_literal << <num_blocks, num_threads >> >(data_gpu, num_elements);
			cuda_error_check("Error ", "return from literal runtime kernel");
			CUDA_CALL(cudaEventRecord(kernel_stop1, 0));
			CUDA_CALL(cudaEventSynchronize(kernel_stop1));
			CUDA_CALL(cudaEventElapsedTime(&delta_time1, kernel_start1, kernel_stop1));

			const_test_gpu_literal << <num_blocks, num_threads >> >(data_gpu, num_elements);
			cuda_error_check("Error ", "return from constant starup kernel");
			CUDA_CALL(cudaEventRecord(kernel_start2, 0));

			const_test_gpu_literal << <num_blocks, num_threads >> >(data_gpu, num_elements);
			cuda_error_check("Error ", "return from constant runtime kernel");
			CUDA_CALL(cudaEventRecord(kernel_stop2, 0));
			CUDA_CALL(cudaEventSynchronize(kernel_stop2));
			CUDA_CALL(cudaEventElapsedTime(&delta_time2, kernel_start2, kernel_stop2));

			if (delta_time1 > delta_time2)
			{
				printf("\n%sConst version is faster by: %.2fms (Const=%.2fms vs. Literal=%.2fms)", device_prefix, delta_time1 = delta_time2, delta_time1, delta_time2);
			}
			else
			{
				printf("\n%sLiteral version is faster by: %.2fms (Const=%.2fms vs. Literal=%.2fms)", device_prefix, delta_time2 = delta_time1, delta_time1, delta_time2);
			}
			CUDA_CALL(cudaEventDestroy(kernel_start1));
			CUDA_CALL(cudaEventDestroy(kernel_start2));
			CUDA_CALL(cudaEventDestroy(kernel_stop1));
			CUDA_CALL(cudaEventDestroy(kernel_stop2));
		}
		CUDA_CALL(cudaDeviceReset());
		printf("\n");
	}
	wait_exit();
}
int main()
{
	gpu_kernel();
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RtZero

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值