GPU上的clock函数问题

“第一个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[i] * num[i];
}
*time = clock() - start;
*result = sum;
}
最后用cudaMemcpy把time拷出来,是一个未初始化的值‘-2123813548’
我的硬件是9800 gtx+

clock一般是在kernel外边host代码中调用,在kernel里边应该不支持吧!

不知道啊,但是它的例子就是在kernel里面调用的clock
另外SDK中有个例子,就叫’clock’,也是在kernel里调用clock,它的能调成功,正在检查有什么不一样

你的代码的结果是:
所有的Thread都会修改timer的值,所以最后的结果是某一个Thread的值;
不知道你要什么结果??

我就是用一个thread执行的,就是本站上那个“第一个cuda程序”
sumOfSquares < < <1, 1, 0>>>(…)

没有问题啊,这是我的代码,看看!
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));

也没优化,简单纪录下每个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
}
}

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[i] * num[i];
}
__syncthreads();
if (thredIdx.x == 0) *time = clock() - start;
*result = sum;
}

这样是计算整个block里面计算的clock时间