cuda cudaMallocManaged 测试

文章比较了在CUDA编程中使用不同内存管理方法(如cudaMallocManaged、cudaMallocHost和cudaHostAlloc)对cufft计算性能的影响,以及展示了如何创建和同步CUDA事件来测量GPU时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下面展示一些 内联代码片


// 开辟内存的不同方法

   cufftComplex* DBF_Result = NULL; // 定义指向cufftComplex类型的指针
   // cudaMallocHost((void**)&DBF_Result, M * N * sizeof(cufftComplex)); // 申请内存空间
    //cudaHostAlloc((void**)&DBF_Result, M * N * sizeof(cufftComplex), cudaHostAllocMapped);   //锁业内存
   // cudaHostAlloc((void**)&DBF_Result, M * N * sizeof(cufftComplex), cudaHostAllocDefault);
    cudaHostAlloc((void**)&DBF_Result, M * N * sizeof(cufftComplex), cudaHostAllocWriteCombined);
   // cudaHostAlloc((void**)&DBF_Result, M * N * sizeof(cufftComplex), cudaHostAllocPortable);

//1. 开辟内存的不同方法cudaMallocManaged 测试

// 开辟内存的不同方法cudaMallocManaged

#include <stdio.h>
#include <windows.h>
#include"iostream"
#include"cuda_runtime_api.h"
#include"device_launch_parameters.h"
#include"cufft.h"
#include <stdio.h>
#include <windows.h>

int main()
{

    const int Nt = 1024*1024;
    const int BATCH = 1;
    cufftComplex* host_in, * host_out, * device_in, * device_out;

    LARGE_INTEGER frequency, start_time, end_time;
    double elapsed_time;

    QueryPerformanceFrequency(&frequency);

    QueryPerformanceCounter(&start_time);


    // create two events
    cudaEvent_t start, stop;
    cudaEventCreate(&start);
    cudaEventCreate(&stop);

    cudaEventRecord(start);

    cudaMallocManaged((void**)&host_in, Nt * sizeof(cufftComplex));
    cudaMallocManaged((void**)&host_out, Nt * sizeof(cufftComplex));
    cudaDeviceSynchronize();

     cudaEventRecord(stop);
     cudaEventSynchronize(stop);         // 等到stop event完成

     float time;
     cudaEventElapsedTime(&time, start, stop);
     cudaEventDestroy(start);// clean up the two events
     cudaEventDestroy(stop);
     printf("GPU Time = %g ms.\n", time);

    for (int i = 0; i < Nt; i++)
    {
        host_in[i].x = i + 1;
        host_in[i].y = 0;

    }
    /*host_in[3].x = 0;
    host_in[3].y = 0;*/
    cufftHandle cufftForwrdHandle;
   
    int m;

    cudaDeviceSynchronize();
   // for (j = 2 * 1024; j <= 1024 * 1024; j *= 2) {

        //cufftPlan1d(&cufftForwrdHandle, 2 * 1024, CUFFT_C2C, BATCH);
        cufftPlan1d(&cufftForwrdHandle, Nt, CUFFT_C2C, BATCH);

        // start = what_time_is_it_now();
    //    double start = GetTickCount64(); //计时器

        int loop = 10;
        for (m = 0; m < loop; m++) {
            //执行fft正变换
            cufftExecC2C(cufftForwrdHandle, host_in, host_out, CUFFT_FORWARD);
        }
        cudaDeviceSynchronize();
        /*QueryPerformanceCounter(&end_time);
        elapsed_time = (double)(end_time.QuadPart - start_time.QuadPart) / frequency.QuadPart;
        printf("Elapsed time: %f milliseconds\n", (elapsed_time * 1000) / loop);*/
        for (int i = 0; i < 4; i++) {
      //     printf("%f+%f\n", host_out[i].x, host_out[i].y);
        }
      return 0;
}

// 2.开辟内存的不同方法cudaMallocHost

// 开辟内存的不同方法cudaMallocHost

 int main()
{
    const int Nt = 1024*1024;
    const int BATCH = 1;

    cufftComplex* host_in, * host_out, * device_in, * device_out;
    cudaMallocHost((void**)&host_in, Nt * sizeof(cufftComplex));
    cudaMallocHost((void**)&host_out, ( Nt+1) * sizeof(cufftComplex));

    for (int i = 0; i < Nt; i++)
    {
        host_in[i].x = i + 1;
        host_in[i].y = 0;

    }

    // create two events
    cudaEvent_t start, stop;
    cudaEventCreate(&start);
    cudaEventCreate(&stop);

    cudaEventRecord(start);

    //设备内存申请
    cudaMalloc((void**)&device_in, (Nt)  * sizeof(cufftComplex));
    cudaMalloc((void**)&device_out, (Nt) * sizeof(cufftComplex));
    //数据传输--H2D
    cudaMemcpy(device_in, host_in, Nt * sizeof(cufftComplex), cudaMemcpyHostToDevice);

     cudaEventRecord(stop);
     cudaEventSynchronize(stop);         // 等到stop event完成

     float time;
     cudaEventElapsedTime(&time, start, stop);
     cudaEventDestroy(start);// clean up the two events
     cudaEventDestroy(stop);
     printf("GPU Time = %g ms.\n", time);

    cufftHandle cufftForwrdHandle;
    {

        cufftPlan1d(&cufftForwrdHandle, Nt, CUFFT_C2C, BATCH);

        cufftExecC2C(cufftForwrdHandle, device_in, device_out, CUFFT_FORWARD);

        cudaMemcpy(host_out, device_out, Nt * sizeof(cufftComplex), cudaMemcpyDeviceToHost);


        for (int i = 0; i < 10; i++) {
            printf("%f+%f\n", host_out[i].x, host_out[i].y);
        }
    }


    return 0;
### CUDA安装配置及使用教程 #### 一、了解CUDA及其重要性 CUDA(Compute Unified Device Architecture)是由NVIDIA开发的一种并行计算平台和应用程序接口(API),它允许软件开发者通过利用NVIDIA图形处理单元(GPU)来进行通用目的的高性能运算。这在深度学习领域尤为重要,因为CUDA能够显著加快模型训练与推理的速度[^1]。 #### 二、确认硬件兼容性和所需版本 对于想要安装特定版本CUDA工具包的用户来说,首先要做的就是核实自己的计算机是否配备了支持该版本CUDA的NVIDIA显卡。具体操作是在设备管理器中找到NVIDIA控制面板,在其中可以查询到当前使用的驱动程序所对应的CUDA版本号。如果目标是安装CUDA 10.1,则需确保系统的现有设置与此相匹配或者计划更新至相应的驱动版本。 #### 三、下载合适的CUDA Toolkit 访问[NVIDIA官方网页](https://developer.nvidia.com/cuda-toolkit),这里提供了不同操作系统下最新版以及历史版本的CUDA toolkit供选择。按照个人需求挑选适合的操作系统类型,并遵循页面上的指导完成整个下载流程。值得注意的是,除了基本的toolkit外,还可能需要额外安装cuDNN库以满足某些框架的要求,比如TensorFlow或PyTorch等机器学习库[^3]。 #### 四、执行安装过程 一旦完成了上述准备工作之后就可以正式开始了。对于Linux发行版而言,通常建议采用.run文件形式进行本地化部署;而对于Windows用户则更倾向于使用.exe可执行文件的方式。在整个过程中要特别注意阅读每一步提示信息,尤其是关于路径设定的部分,以免造成后续编译错误等问题的发生。另外还需记得将新加入环境变量中的`bin`目录添加进PATH里去以便命令行可以直接调用nvcc等相关工具[^2]。 #### 五、验证安装成功与否 最后一步是要测试一下刚刚装好的CUDA能否正常工作。可以通过编写一段简单的C/C++代码来实现这一点,这段小程序会尝试创建一个线程并在GPU上运行简单算术运算任务。当一切顺利的话应该可以看到预期的结果输出,证明CUDA已经正确无误地集成到了现有的开发环境中去了。 ```cpp #include <stdio.h> __global__ void add(int n, float *x, float *y) { int index = threadIdx.x; int stride = blockDim.x; for (int i = index; i < n; i += stride) y[i] = x[i] + y[i]; } int main(void) { const int N = 1 << 20; float *x, *y; cudaMallocManaged(&x, N*sizeof(float)); cudaMallocManaged(&y, N*sizeof(float)); for (int i = 0; i < N; i++) { x[i] = 1.0f; y[i] = 2.0f; } add<<<1, 256>>>(N, x, y); cudaDeviceSynchronize(); printf("%f\n", y[0]); cudaFree(x); cudaFree(y); return 0; } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值