用户
 找回密码
 立即注册
sn0419 该用户已被删除
发表于 2009-11-18 18:48:31
92877
“第一个Cuda程序”中用到了GPU上的clock函数,为啥我用的时候不好用呢?
__global__ static void sumOfSquares(int *num, int* result, clock_t *time)
{
    int sum = 0;
    int i;
    clock_t start = clock();
    for(i = 0; i < DATA_SIZE; i++) {
        sum += num * num;
    }
    *time = clock() - start;
    *result = sum;
}
最后用cudaMemcpy把time拷出来,是一个未初始化的值‘-2123813548’
我的硬件是9800 gtx+
使用道具 举报 回复
发表于 2009-11-18 18:50:18
clock一般是在kernel外边host代码中调用,在kernel里边应该不支持吧!
使用道具 举报 回复 支持 反对
发表于 2009-11-18 18:51:19
不知道啊,但是它的例子就是在kernel里面调用的clock
另外SDK中有个例子,就叫'clock',也是在kernel里调用clock,它的能调成功,正在检查有什么不一样
使用道具 举报 回复 支持 反对
发表于 2009-11-18 18:52:49
你的代码的结果是:
所有的Thread都会修改timer的值,所以最后的结果是某一个Thread的值;
不知道你要什么结果??
使用道具 举报 回复 支持 反对
发表于 2009-11-18 18:54:15
我就是用一个thread执行的,就是本站上那个“第一个cuda程序”
sumOfSquares < < <1, 1, 0>>>(...)
使用道具 举报 回复 支持 反对
发表于 2009-11-18 19:17:01
没有问题啊,这是我的代码,看看!
int *gpu_input = 0;
int n;
int l_input[DATA_SIZE];
for(n = 0; n < DATA_SIZE; n++)
{
l_input[n] = n;
}
int *gpu_iResult = 0;
clock_t*gpu_timerResult = 0;
clock_t htimer;
CUDA_SAFE_CALL(cudaMalloc((void**)&gpu_input, sizeof(int) * DATA_SIZE));
CUDA_SAFE_CALL(cudaMalloc((void**)&gpu_iResult, sizeof(int)));
CUDA_SAFE_CALL(cudaMalloc((void**)&gpu_timerResult, sizeof(clock_t)));
CUDA_SAFE_CALL(cudaMemcpy(gpu_input, l_input, sizeof(int) * DATA_SIZE, cudaMemcpyHostToDevice));
sumOfSquares < < <1, 1, 0>>>(gpu_input, gpu_iResult, gpu_timerResult);
CUDA_SAFE_CALL(cudaMemcpy(&htimer, gpu_timerResult, sizeof(clock_t), cudaMemcpyDeviceToHost));

    CUDA_SAFE_CALL(cudaFree(gpu_input));
    CUDA_SAFE_CALL(cudaFree(gpu_iResult));
    CUDA_SAFE_CALL(cudaFree(gpu_timerResult));
使用道具 举报 回复 支持 反对
发表于 2009-11-18 19:21:23
也没优化,简单纪录下每个BLOCK所属threads的平均执行时间

C/C++ code

extern __shared__ clock_t smem[];

__global__ static void block_clock_recorder(clock_t *oms/,*other params list if nessary*/)
{
    clock_t smem[threadIdx.x]=clock();

    calc_code
   
    offset=blockDim.x/2;
    clock_t t=clock-smem[threadIdx.x];
    smem[threadIdx.x]=t;

    do{
        __syncthreads();
        if(threadIdx.x<offset){
            smem[threadIdx.x]+=smem[threadIdx.x+offset];
        }
        offset>>=1;
    }while(offset>0)


    if(!blockIdx.x){
        oms[blockIdx.x]=smem[0]/blockDim.x; //replace "blockDim.x" with blockArea if used 2D grid
    }
}
使用道具 举报 回复 支持 反对
发表于 2009-11-18 19:29:29
C/C++ code__global__ static void sumOfSquares(int *num, int* result, clock_t *time)
{
    int sum = 0;
    int i;
    clock_t start;
    if (thredIdx.x == 0)
    {   
        start = clock();
    }

    for(i = 0; i < DATA_SIZE; i++) {
        sum += num * num;
    }
    __syncthreads();
    if (thredIdx.x == 0) *time = clock() - start;
    *result = sum;
}


这样是计算整个block里面计算的clock时间
使用道具 举报 回复 支持 反对
发新帖
您需要登录后才可以回帖 登录 | 立即注册