【问题标题】:Am I using constant memory correctly?我是否正确使用常量内存?
【发布时间】:2015-05-13 14:04:32
【问题描述】:

我写了一个简单的 Cuda C 程序,它接受 N 个数字并将它们乘以一个因数 c;因为这个因素是一个常数,我决定把它放在常数记忆中。

这是 main.cu 代码:

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

__constant__ float c; // IS THIS OK?

typedef struct{
    float a;
}variable;
variable *var_CPU,*var_GPU;

#include "kernel.cu"

//==============================================================
int main(void){

   int i,N=100;
   var_CPU = (variable*)malloc(N*sizeof(variable));
   for(i=0;i<N;i++){
      var_CPU[i].a=(float)i;
      printf("var_CPU[%d].a=%f\n",i,var_CPU[i].a);
   }

   float pc=2; // IS THIS OK?

   cudaMemcpyToSymbol(c, &pc, sizeof(c)); // IS THIS OK?


   cudaMalloc((void**)&var_GPU,N*sizeof(variable));
   cudaMemcpy(var_GPU,var_CPU,N*sizeof(variable), cudaMemcpyHostToDevice);
   CollisioniGPU<<<10, 10>>>(var_GPU);
   cudaGetLastError();

   cudaMemcpy(var_CPU, var_GPU, N*sizeof(variable),cudaMemcpyDeviceToHost);
   for(i=0;i<N;i++){
      printf("var_CPU[%d].a=%f\n",i,var_CPU[i].a);
   }

   cudaFree(var_GPU);
   free(var_CPU);

   return 0;
}

这是kernel.cu:

__device__ void funzione(float *var){

        *var = *var*c;    
}

__global__ void CollisioniGPU(variable *var_GPU){

    int id= blockIdx.x*blockDim.x + threadIdx.x;

    float a;

    a=var_GPU[id].a;

    funzione(&a);

    var_GPU[id].a = a;      
}

这是我的问题:这是使用常量内存的正确方法吗?我如何确定乘法因子 c 保存在那里而不是其他地方?

【问题讨论】:

  • 没关系。您基本上是在使用 #include 将代码插入 main.cu
  • 嗯,“#include”是什么意思?有什么问题吗?
  • 您的代码相当于将kernel.cu 中的代码插入main.cu 中,其中您有#include "kernel.cu" 行

标签: c memory cuda constants


【解决方案1】:

这对我来说似乎是正确的,因为我会写一些不同的东西。

对于 c 的定义,我会将其放在 kernel.cu 中,并在 main.cu 中添加 extern 关键字。 (而且因为我很懒,所以我经常把这两个文件放在一个文件中,两个部分用一些注释块分开。)

对于带有float pc = 2的行;我经常加点和零,因为在阅读代码时更容易区分整数和浮点变量。

对于 cudaMemcpyToSymbol(c, &pc, sizeof(c));我会使用 sizeof(float)。

这一切都只是代码的偏好和澄清问题。

【讨论】:

    猜你喜欢
    • 2011-04-30
    • 1970-01-01
    • 2012-10-25
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    • 2014-05-15
    • 2010-12-31
    • 1970-01-01
    相关资源
    最近更新 更多