Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 我是否正确使用了常量内存?_C_Memory_Cuda_Constants - Fatal编程技术网

C 我是否正确使用了常量内存?

C 我是否正确使用了常量内存?,c,memory,cuda,constants,C,Memory,Cuda,Constants,我写了一个简单的CUDAC程序,它取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" /

我写了一个简单的CUDAC程序,它取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;
}
__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保存在那里而不是其他地方呢?

我觉得这似乎是正确的,因为我写的东西会有点不同

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

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

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


这些都只是代码的预引用和澄清问题。

没关系。您基本上是在使用#include将代码插入main.cummm中,您说的#include是什么意思?是否有问题?您的代码相当于将
kernel.cu
中的代码插入到
main.cu
中,其中包含
#include“kernel.cu”
可能重复的代码行