我是否正确使用恒定记忆?

时间:2015-03-11 16:43:07

标签: c memory cuda constants

我写了一个简单的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 保存在那里而不是其他地方?

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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