cuda,常量内存使用2

<img src="data:image/png;base64,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" alt="" />
#include <stdio.h>
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <iostream>
#include "assert.h"
#include "conio.h"
using namespace std;
#define u16 unsigned short int
#define u32 unsigned int
#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 4096
__constant__ static const u32 const_data_gpu[KERNEL_LOOP];
__device__ static u32 gmem_data_gpu[KERNEL_LOOP];
static u32 const_data_host[KERNEL_LOOP];
__global__ void const_test_gpu_gmem(u32 * const data, const u32 num_elements)
{
	const u32 tid = (blockDim.x*blockIdx.x) + threadIdx.x;
	if (tid < num_elements)
	{
		u32 d = gmem_data_gpu[0];
		for (u32 i = 0; i < KERNEL_LOOP; i++)
		{
			d ^= gmem_data_gpu[i];
			d |= gmem_data_gpu[i];
			d &= gmem_data_gpu[i];
			d |= gmem_data_gpu[i];
		}
		data[tid] = d;
	}
}
__global__ void const_test_gpu_const(u32 * const data, const u32 num_elements)
{
	const u32 tid = (blockDim.x*blockIdx.x) + threadIdx.x;
	if (tid < num_elements)
	{
		u32 d = gmem_data_gpu[0];
		for (u32 i = 0; i < KERNEL_LOOP; i++)
		{
			d ^= gmem_data_gpu[i];
			d |= gmem_data_gpu[i];
			d &= gmem_data_gpu[i];
			d |= gmem_data_gpu[i];
		}
		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 generate_rand_data(u32 * host_data_ptr)
{
	for (u32 i = 0; i < KERNEL_LOOP; i++)
	{
		host_data_ptr[i] = (u32)rand();
	}
}
__host__ void gpu_kernel(void)
{
	const u32 num_elements = (128 * 1024);
	const u32 num_threads = 256;
	const u32 num_blocks = (num_elements + (num_threads - 1)) / num_threads;
	const u32 num_bytes = num_elements*sizeof(u32);
	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));
		u32 *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);

		for (int num_test = 0; num_test < max_runs; num_test++)
		{
			generate_rand_data(const_data_host);
			CUDA_CALL(cudaMemcpyToSymbol(const_data_gpu, const_data_host, KERNEL_LOOP*sizeof(u32)));
			const_test_gpu_gmem << <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_gmem << <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));

			CUDA_CALL(cudaMemcpyToSymbol(const_data_gpu, const_data_host, KERNEL_LOOP*sizeof(u32)));
			const_test_gpu_const << <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_const << <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(cudaFree(data_gpu));
		CUDA_CALL(cudaDeviceReset());
		printf("\n");
	}
	wait_exit();
}

int main()
{
	gpu_kernel();
	cin.get();
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

RtZero

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

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

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

打赏作者

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

抵扣说明:

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

余额充值