簡體   English   中英

我是否正確使用常量內存?

[英]Am I using constant memory correctly?

我編寫了一個簡單的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保存在此處而不是其他位置?

對我來說似乎是正確的,因為我寫的東西會有所不同。

對於c的定義,我將其放在kernel.cu中,並在main.cu中添加extern關鍵字。 (並且由於我很懶,所以我經常只是將這兩個文件放在一起,然后將其分為兩部分,再加上一些注釋塊。)

對於浮點pc = 2的行; 我經常加點和零,因為在讀取代碼時更容易區分整數變量和浮點變量。

對於cudaMemcpyToSymbol(c,&pc,sizeof(c)); 我會用過sizeof(float)。

這一切都只是代碼的優選和澄清的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM