POPPUR爱换

 找回密码
 注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

搜索
查看: 987|回复: 4
打印 上一主题 下一主题

关于提升显卡核心和SP频率使程式运算时间改变的问题

[复制链接]
跳转到指定楼层
1#
发表于 2008-12-6 14:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <stdio.h>
#include
<stdlib.h>
#include
<cuda_runtime.h>
#define DATA_SIZE 1048576
#define THREAD_NUM 256    //最多仅支持512个thread
int data[DATA_SIZE];

void GenerateNumbers(int
*number, int size)
{
   
for(int i =
0; i < size; i++)
    {
        number
= rand() %
10;
    }
}


bool InitCUDA()   //CUDA设备初始化代码
{
   
int count;

    cudaGetDeviceCount(
&count);
   
if(count ==
0)
    {
        fprintf(stderr,
"There is no device.n");
        
return
false;
    }

   
int i;
   
for(i =
0; i < count; i++)
    {
        cudaDeviceProp prop;
        
if(cudaGetDeviceProperties(&prop, i) == cudaSuccess)
        {
            
if(prop.major >=
1)
            {
               
break;
            }
        }
    }

   
if(i == count)
    {
        fprintf(stderr,
"There is no device supporting CUDA 1.x.n");
        
return
false;
    }

    cudaSetDevice(i);   
//只能使用一个CUDA设备?

return
true;
}

__global__
static
void sumOfSquares(int
*num, int* result,clock_t* time)  //例程
{
   
const
int tid=threadIdx.x;
   
const
int size=DATA_SIZE/THREAD_NUM;

   
int sum =
0;
   
int i;

    clock_t start;

   
if(tid==0)
        start
=clock();

   
for(i = tid*size; i < (tid+1)*size; i++)
    {
        sum
+= num * num;
    }

    result[tid]
= sum;

   
if(tid==0)
        
*time=clock()-start;  //计算时间代码
}


int main()
{
   
if(!InitCUDA())
    {
        
return
0;
    }

    printf(
"CUDA initialized.n");
   
    GenerateNumbers(data, DATA_SIZE);  
//随机生成数字

int* gpudata, *result;

    clock_t
* time;

    cudaMalloc((
void**) &gpudata, sizeof(int) * DATA_SIZE);
    cudaMalloc((
void**) &result, sizeof(int) *THREAD_NUM);
    cudaMalloc((
void**) &time,sizeof(clock_t));
    cudaMemcpy(gpudata, data,
sizeof(int) * DATA_SIZE, cudaMemcpyHostToDevice);
        
    sumOfSquares
<<<1, THREAD_NUM, 0>>>(gpudata, result,time);

   
int sum[THREAD_NUM];

    clock_t time_used;

    cudaMemcpy(
&sum, result, sizeof(int)*THREAD_NUM, cudaMemcpyDeviceToHost);
    cudaMemcpy(
&time_used,time,sizeof(clock_t),cudaMemcpyDeviceToHost);
    cudaFree(gpudata);
    cudaFree(result);
    cudaFree(time);

   
int final_sum =
0;

   
for(int i =
0; i < THREAD_NUM; i++)
    {
        final_sum
+= sum;
    }

    printf(
"sum=%d  time=%dn",final_sum,time_used);
   
    final_sum
=
0;

   
for(int i =
0; i < DATA_SIZE; i++)
    {
        final_sum
+= data * data;
    }
    printf(
"sum(CPU)= %dn", sum);

    system(
"pause");
   
   
return
0;
}



  
在这个程序中,当我提升显卡的核心和SP单元频率时,发现程序的运算时间反而加长了,当我提升显卡的显存频率时,程序的运算时间倒是降低了,请问这是怎么回事呢?
  
环境VS2008,CUDA 2.1 beta。
  
非常感谢!
2#
发表于 2008-12-6 21:03 | 只看该作者
天书?{shocked:]
回复 支持 反对

使用道具 举报

3#
 楼主| 发表于 2008-12-7 18:40 | 只看该作者

回复 2# helpyyl 的帖子

总算有个回帖的了..
回复 支持 反对

使用道具 举报

4#
发表于 2008-12-7 21:32 | 只看该作者
来帮LZ 顶下, 这东西咋这么像 C 语言......
回复 支持 反对

使用道具 举报

5#
发表于 2008-12-7 21:40 | 只看该作者
这说明你的程序的瓶颈在memory。

你增加程序的运算量看看?

1。增加你的kernel函数sumOfSquares的复杂性。
2。sumOfSquares<<<1, THREAD_NUM, 0>>>(gpudata, result,time) 改用多个CTA试试。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

广告投放或合作|网站地图|处罚通告|

GMT+8, 2025-8-14 06:55

Powered by Discuz! X3.4

© 2001-2017 POPPUR.

快速回复 返回顶部 返回列表