用户
 找回密码
 立即注册
发表于 2020-12-11 14:52:22
71520
本帖最后由 jfjkzero 于 2020-12-11 14:55 编辑

最近学习CUDA C的编程,在并行运行一个简单的解调算法的时候,统计时间后发现运行速度越来越慢(但还是运算结果正确的),后来简化到只运行其中一个核函数的时候,就算复杂度下降了,但还是会越跑越慢,尝试过每一轮都进行cudafree和cudamalloc也没用,这是为什么呢?
刚刚还发现了,对于我用过的一些矩阵加法、矩阵点乘的教程例子,加上for循环跑很多很多次,也是会出现这种越来越慢的情况。

环境:
win10 Visual studio2019 community  
cuda 10.2
cudnn 7.6.5
用几年前的笔记本进行测试——显卡950M
跪求各路大神救救了
简化后作为测试的代码如下:

  1. #include <stdio.h>
  2. #include<cuda.h>
  3. #include<cuda_runtime.h>
  4. #include "..\common\book.h"
  5. #include <math.h>
  6. #include <time.h>

  7. #define BLOCK_NUM 16
  8. #define THREAD_NUM 16
  9. #define R_SIZE 256 //256
  10. #define M_SIZE R_SIZE*R_SIZE //256*256
  11. #define SNR_LEN 7
  12. #define N 100
  13. #define pi 3.1415926535
  14. double SNR[SNR_LEN] = { 0,1,2,3,4,5,6 };

  15. __global__ void DeModuate(double* ReceivedSignal_R, short int* demodSignal_HD, double sigma)
  16. {
  17.         const int row = blockIdx.x * THREAD_NUM + threadIdx.x;
  18.         double P_temp0, P_temp1, demodSignal_LLR;
  19.         for (int i = 0; i < R_SIZE; i++)
  20.         {
  21.                
  22.                 demodSignal_LLR = 4 * ReceivedSignal_R[row * R_SIZE + i] / sigma;

  23.                 demodSignal_HD[row * R_SIZE + i] = (demodSignal_LLR > 0 ? 1 : 0);

  24.         }
  25. }

  26. int main(int arc, char* argv[])
  27. {
  28.         //GPU declaration
  29.         double * Dev_ReceivedSignal_R;
  30.         short int* Dev_demodSignal_HD;
  31.         //GPU malloc
  32.         HANDLE_ERROR(cudaMalloc((void**)&Dev_ReceivedSignal_R, sizeof(double) * M_SIZE));
  33.         HANDLE_ERROR(cudaMalloc((void**)&Dev_demodSignal_HD, sizeof(short int) * M_SIZE));

  34.         //time_counting declaration
  35.         clock_t start, end;
  36.         double DeMod_time = 0;
  37.         int  DeMod_time_temp;
  38.         DeMod_time_temp = 0;
  39.         for (int s = 0; s < SNR_LEN; s++)
  40.         {

  41.                 err_Uncoded = 0;

  42.                 for (int frame = 0; frame < N; frame++)
  43.                 {

  44.                         start = clock();
  45.                         DeModuate << <BLOCK_NUM, THREAD_NUM >> > (Dev_ReceivedSignal_R, Dev_demodSignal_HD, sigma);
  46.                         end = clock();

  47.                         DeMod_time_temp += (end - start);

  48.                         DeMod_time = (double)DeMod_time_temp / CLK_TCK;
  49.                         printf("SNR = %1.1f, %4d/%d sim finished, ori_err = %4d, time: %f\n", SNR[s], frame, N, err_Uncoded_temp, DeMod_time);               
  50.                 }
  51.                
  52.         }
  53.         for (int s = 0; s < SNR_LEN; s++)
  54.         {
  55.                 printf("SNR = %1.1f dB,BER_Uncoded= %1.10f;\n", SNR[s], BER_Uncoded[s]);
  56.         }

  57.         //GPU free
  58.         cudaFree(Dev_demodSignal_HD);
  59.         cudaFree(Dev_ReceivedSignal_R);
  60.         return 0;
  61. }
复制代码




使用道具 举报 回复
发新帖
您需要登录后才可以回帖 登录 | 立即注册