我是否正确使用常量内存?
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关键字。 (而且因为我很懒,所以我经常把这两个文件合二为一,分成两部分,用一些注释块分开。)
对于 float pc = 2 的行;我经常加上点和零,因为在阅读代码时更容易区分整数和浮点变量。
对于 cudaMemcpyToSymbol(c, &pc, sizeof(c));我会使用 sizeof(float).
这只是代码的偏好和澄清问题。
我写了一个简单的 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关键字。 (而且因为我很懒,所以我经常把这两个文件合二为一,分成两部分,用一些注释块分开。)
对于 float pc = 2 的行;我经常加上点和零,因为在阅读代码时更容易区分整数和浮点变量。
对于 cudaMemcpyToSymbol(c, &pc, sizeof(c));我会使用 sizeof(float).
这只是代码的偏好和澄清问题。