`
javatgo
  • 浏览: 1169605 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

NVIDIA CUDA clock.cu 代码

 
阅读更多

//VC++ 2010 + CUDA 4.1


#ifndef _CLOCK_KERNEL_H_
#define _CLOCK_KERNEL_H_

// This kernel computes a standard parallel reduction and evaluates the
// time it takes to do that for each block. The timing results are stored
// in device memory.
__global__ static void timedReduction(const float * input, float * output, clock_t * timer)
{
// __shared__ float shared[2 * blockDim.x];
extern __shared__ float shared[];

const int tid = threadIdx.x;
const int bid = blockIdx.x;

if (tid == 0) timer[bid] = clock();

// Copy input.
shared[tid] = input[tid];
shared[tid + blockDim.x] = input[tid + blockDim.x];

// Perform reduction to find minimum.
for(int d = blockDim.x; d > 0; d /= 2)
{
__syncthreads();

if (tid < d)
{
float f0 = shared[tid];
float f1 = shared[tid + d];

if (f1 < f0) {
shared[tid] = f1;
}
}
}

// Write result.
if (tid == 0) output[bid] = shared[0];

__syncthreads();

if (tid == 0) timer[bid+gridDim.x] = clock();
}

#endif // _CLOCK_KERNEL_H_





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

#include <shrQATest.h>
#include <cutil_inline.h>

#include "clock_kernel.cu"

// This example shows how to use the clock function to measure the performance of
// a kernel accurately.
//
// Blocks are executed in parallel and out of order. Since there's no synchronization
// mechanism between blocks, we measure the clock once for each block. The clock
// samples are written to device memory.

#define NUM_BLOCKS 64
#define NUM_THREADS 256

// It's interesting to change the number of blocks and the number of threads to
// understand how to keep the hardware busy.
//
// Here are some numbers I get on my G80:
// blocks - clocks
// 1 - 3096
// 8 - 3232
// 16 - 3364
// 32 - 4615
// 64 - 9981
//
// With less than 16 blocks some of the multiprocessors of the device are idle. With
// more than 16 you are using all the multiprocessors, but there's only one block per
// multiprocessor and that doesn't allow you to hide the latency of the memory. With
// more than 32 the speed scales linearly.

int main(int argc, char** argv)
{
shrQAStart(argc, argv);

// use command-line specified CUDA device, otherwise use device with highest Gflops/s
if ( cutCheckCmdLineFlag(argc, (const char **)argv, "device")) {
int devID = cutilDeviceInit(argc, argv);
if (devID < 0) {
printf("No CUDA Capable devices found, exiting...\n");
shrQAFinishExit(argc, (const char **)argv, QA_WAIVED);
}
} else {
cudaSetDevice( cutGetMaxGflopsDeviceId() );
}

float * dinput = NULL;
float * doutput = NULL;
clock_t * dtimer = NULL;

clock_t timer[NUM_BLOCKS * 2];
float input[NUM_THREADS * 2];

for (int i = 0; i < NUM_THREADS * 2; i++)
{
input[i] = (float)i;
}

cutilSafeCall(cudaMalloc((void**)&dinput, sizeof(float) * NUM_THREADS * 2));
cutilSafeCall(cudaMalloc((void**)&doutput, sizeof(float) * NUM_BLOCKS));
cutilSafeCall(cudaMalloc((void**)&dtimer, sizeof(clock_t) * NUM_BLOCKS * 2));

cutilSafeCall(cudaMemcpy(dinput, input, sizeof(float) * NUM_THREADS * 2, cudaMemcpyHostToDevice));

timedReduction<<<NUM_BLOCKS, NUM_THREADS, sizeof(float) * 2 * NUM_THREADS>>>(dinput, doutput, dtimer);

//cutilSafeCall(cudaMemcpy(output, doutput, sizeof(float) * NUM_BLOCKS, cudaMemcpyDeviceToHost));
cutilSafeCall(cudaMemcpy(timer, dtimer, sizeof(clock_t) * NUM_BLOCKS * 2, cudaMemcpyDeviceToHost));

cutilSafeCall(cudaFree(dinput));
cutilSafeCall(cudaFree(doutput));
cutilSafeCall(cudaFree(dtimer));


// Compute the difference between the last block end and the first block start.
clock_t minStart = timer[0];
clock_t maxEnd = timer[NUM_BLOCKS];

for (int i = 1; i < NUM_BLOCKS; i++)
{
minStart = timer[i] < minStart ? timer[i] : minStart;
maxEnd = timer[NUM_BLOCKS+i] > maxEnd ? timer[NUM_BLOCKS+i] : maxEnd;
}

printf("time = %d\n", maxEnd - minStart);

cutilDeviceReset();

// This test always passes.
shrQAFinishExit(argc, (const char **)argv, QA_PASSED);
}





分享到:
评论

相关推荐

    VC++的.cpp文件调用CUDA的.cu文件中的函数

    CUDA(Compute Unified Device Architecture)是NVIDIA提供的一种并行计算平台和编程模型,它允许开发者直接利用GPU(图形处理器)进行计算,极大地提高了计算效率。本篇文章将详细介绍如何在VC++的.cpp文件中调用...

    nvidia cuda 学习.md

    nvidia cuda 学习.md

    英伟达cuda认证通过代码nbody.cu

    英伟达cuda认证通过代码

    cudnn8.9.7 for cuda12.x,NVIDIA很ex,需要登录才能下载

    cudnn8.9.7 for cuda12.x,NVIDIA很ex,需要登录才能下载

    preprocess.cu和preprocess.h文件

    4. **CUDA加速**:`preprocess.cu`的后缀`.cu`表明它包含CUDA代码,这意味着预处理操作可能利用GPU的并行计算能力来加速。CUDA是NVIDIA提供的编程接口,可以编写GPU执行的计算密集型任务,提高效率。 5. **内存管理...

    cudnn8.4 for cuda11.x

    NVIDIA很恶心,需要注册开发者才能下载

    VS2012+CUDA8.0 visual assist对.cu和.cuh高亮注册表

    在CUDA编程中,`.cu`文件包含了设备代码(device code),这些代码将在GPU上运行,而`.cuh`文件则包含与CUDA相关的函数、常量、结构体等声明,供其他CUDA或C/C++源文件引用。Visual Assist的高亮支持能帮助开发者更...

    CUDA规约求和.cu

    CUDA规约求和.cu

    nvidia.cuda.tar.zip

    nvidia-docker-images,Linux版本GPU测试容器镜像,主要用于linux环境下支持GPU资源,容器调用GPU资源前驱动测试

    cuda_10.1.243_win10_network.exe

    cudn 10.1 版本,目前最新版位11.1版本,但是在编译yolo时可能会有问题所以在使用当前最新的yolo v4时最好用这个版本(2020.10)

    cuda_8.0.61.2_windows

    cuda_8.0.61.2_windows :win7平台下的安装资源,英伟达的cuda驱动

    nvcuda.rar

    2. **安装CUDA Toolkit**:NVIDIA CUDA Toolkit提供了开发和运行CUDA应用程序所需的所有软件组件,包括nvcuda.dll。确保你已安装了对应版本的CUDA Toolkit,并且与你的NVIDIA驱动版本匹配。 3. **拷贝DLL文件**:...

    《CUDA C编程》CodeSamples源代码

    CUDA(Compute Unified Device Architecture)是由NVIDIA推出的一种编程模型,它允许程序员使用C、C++或Fortran等熟悉的编程语言直接对GPU进行编程,以充分利用GPU的并行计算能力。 1. CUDA编程基础: - CUDA架构...

    nvidia.cuda.tar.z01

    nvidia-docker-images,Linux版本GPU测试容器镜像,主要用于linux环境下支持GPU资源,容器调用GPU资源前驱动测试

    Ubuntu_Qt_CUDA编程.pdf

    * 在fftshift.cu文件下编写CUDA算法函数 * 需要注意的是,我们无法直接在.cpp文件调用核函数,需要在核函数下方再写一个调用核函数的函数 六、main函数的调用 * 在main函数中调用算法函数 * 结果与VS编译一致,...

    深度学习环境安装工具-cuda6.0.tar.gz

    深度学习是现代人工智能领域的重要分支,它依赖于高性能计算平台,而CUDA(Compute Unified Device Architecture)正是NVIDIA公司推出的一种并行计算平台和编程模型,为GPU(图形处理器)提供了高效的编程工具。CUDA...

    英伟达CUDA C/C++加速和优化N体模拟器认证通过代码01-nbody.cu

    异步流及 CUDA C/C++ 应用程序的可视化性能分析 最后的练习:加速和优化N体模拟器 n-body 模拟器可以预测通过引力相互作用的一组物体的个体运动。01-nbody.cu 包含一个简单而有效的 n-body 模拟器,适合用于在三维...

    nvidia.cuda.tar.z02

    nvidia-docker-images,Linux版本GPU测试容器镜像,主要用于linux环境下支持GPU资源,容器调用GPU资源前驱动测试

    cudnn-windows-x86-64-8.5.0.96-cuda11-archive.zip

    然后,从NVIDIA官方网站下载CuDNN 8.5.0.96的Windows x86_64版本,解压得到的压缩包"cuda11-archive",其中包含头文件、库文件以及示例代码。 1. 添加库路径:将解压后的`bin`目录添加到系统的PATH环境变量中,这样...

Global site tag (gtag.js) - Google Analytics