c-Cuda全局函数的工作速度比主机函数慢



我有两个空位,它们在做同样的事情:向量与数字的乘积。一个是简单的c void,另一个是全局的。但在测量时间后,我发现正则c函数的工作速度比全局函数快得多。它们在这里:

#define N 1000
__global__ void VectorOnNumber(double *vector1, double number, double *resultVector){
int tid = threadIdx.x + blockIdx.x*blockDim.x;
if(tid < N){
resultVector[tid] = vector1[tid]*number;
}
}
void von(double vec[N], double n, double res[N]){
for(int i = 0; i < N; i++){
res[i] = vec[i]*n;
}
}
int main(){
double x[N], u[N];
double *pointerToVector = (double *)x, *pointerToU = (double *)u;

for(int i = 0; i < N; i++){
x[i] = i*i;
v[i] = i+i;
}
clock_t start = clock();
von(x, 10, u);
clock_t end = clock();
float seconds = (float)(end - start) / CLOCKS_PER_SEC;
printf("%fn", seconds); // 0.03 ms

cudaMalloc(&pointerToVector, N*sizeof(double));
cudaMalloc(&pointerToU, N*sizeof(double));
cudaMemcpy(pointerToVector, x, N*sizeof(double), cudaMemcpyHostToDevice);
cudaMemcpy(pointerToU, u, N*sizeof(double), cudaMemcpyHostToDevice);
cudaEvent_t start, stop;
float elapsedTime;
cudaEventCreate(&start);
cudaEventRecord(start,0);
VectorOnNumber<<<N, 1>>>(pointerToVector, 10, pointerToVector);
cudaEventCreate(&stop);
cudaEventRecord(stop,0);
cudaEventSynchronize(stop);
cudaEventElapsedTime(&elapsedTime, start,stop);
printf(%f msn" ,elapsedTime);//gives 0.08ms

cudaFree(pointerToVector);
cudaFree(pointerToU);
return 0;
}

为什么会发生这种情况?提前谢谢。

有很多缺陷:pointerToU没有使用,作为v,您没有使用dim3 grid,threads。无论如何,我知道有N块只有一个线程,所以你的内核没有联合内存访问的好处,这可能是cuda版本比cpu版本慢的主要原因尝试

VectorOnNumber<<<N/32+1,32>>>(pointerToVector, 10, pointerToVector);

这是我的代码:GPU内核:

void VectorOnNumber(double *vector1, double number, double *resultVector,int N)
{
dim3 grid(N/256+1),threads(256);
VectorOnNumber_K<<<grid,threads>>>(vector1, number, resultVector,N);
}
__global__
void VectorOnNumber_K(double *vector1, double number, double *resultVector,int N)
{
int tid = threadIdx.x + blockIdx.x*blockDim.x;
if(tid < N){
resultVector[tid] = vector1[tid]*number;
}
}

void VectorOnNumberf(float *vector1, float number, float *resultVector,int N)
{
dim3 grid(N/256+1),threads(256);
VectorOnNumberf_K<<<grid,threads>>>(vector1, number, resultVector,N);
}
__global__
void VectorOnNumberf_K(float *vector1, float number, float *resultVector,int N)
{
int tid = threadIdx.x + blockIdx.x*blockDim.x;
if(tid < N){
resultVector[tid] = vector1[tid]*number;
}
}

CPU:

void Stack_von(double *vec, double n, double *res,int N)
{
int i;
for(i = 0; i < N; i++){
res[i] = vec[i]*n;
}
}
void Stack_vonf(float *vec, float n, float *res,int N)
{
int i;
for(i = 0; i < N; i++){
res[i] = vec[i]*n;
}
}

完整测试:

void Stack()
{
int i,N;
double *x,*u,*dx,*du;
float  *fx,*fu,*dfx,*dfu;
N=1000000;
x=new double[N];
u=new double[N];
fx=new float[N];
fu=new float[N];

for(i = 0; i < N; i++){
x[i] = i*i;
fx[i] = i*i;
}
// cpu
printf("startn");
clock_t start = clock();
for(int k=0; k < 1000; k++) Stack_von(x, 10, u,N);
clock_t end = clock();
float seconds = (float)(end - start) / CLOCKS_PER_SEC;
printf("host double %f msn", seconds); 
start = clock();
for(int k=0; k < 1000; k++) Stack_vonf(fx, 10, fu,N);
end = clock();
seconds = (float)(end - start) / CLOCKS_PER_SEC;
printf("host float  %f msn", seconds); // 0.03 ms

// gpu
cudaMalloc(&dfx, N*sizeof(float));
cudaMalloc(&dfu, N*sizeof(float));
cudaMemcpy(dfx, fx, N*sizeof(float), cudaMemcpyHostToDevice);
cudaMalloc(&dx, N*sizeof(double));
cudaMalloc(&du, N*sizeof(double));
cudaMemcpy(dx, x, N*sizeof(double), cudaMemcpyHostToDevice);
cudaEvent_t dstart, dstop;
float elapsedTime;
cudaEventCreate(&dstart);
cudaEventCreate(&dstop);
cudaEventRecord(dstart,0);
VectorOnNumber(dx, 10, du,N);
cudaEventRecord(dstop,0);
cudaEventSynchronize(dstop);
cudaEventElapsedTime(&elapsedTime, dstart,dstop);
printf("device double %f msn" ,elapsedTime);
cudaEventRecord(dstart,0);
VectorOnNumberf(dfx, 10, dfu,N);
cudaEventRecord(dstop,0);
cudaEventSynchronize(dstop);
cudaEventElapsedTime(&elapsedTime, dstart,dstop);
printf("device float  %f msn" ,elapsedTime);

cudaFree(dx);
cudaFree(du);
cudaFree(dfx);
cudaFree(dfu);
delete [] x;
delete [] u;
delete [] fx;
delete [] fu;
}

结果主机双:1.35ms浮动0.45ms设备双0.067ms浮子0.037ms

设备(GTX1080(比主机(XEON 3.50GHz 8核(快10倍我将N设置为10^6以使其可测量

但是如果每个块只有一个线程,那么设备上的时间是1.37ms!

最新更新