如题,请问版主如何查看电脑的CPU和GPU浮点运算理论峰值?
楼主您好,
N卡的峰值可以用SP频率(新的3.x上,这个频率就是GPU频率) * SP个数 * 2 得到。
例如你的卡有768个SP, 主频是1.033Ghz, 则float峰值是:
768 * 1.033 * 2 = 1586GFlops
关于非N卡的GPU,以及CPU, 我不知道应该怎么计算。
(不同CPU的峰值浮点千差万别的)
感谢来访。
我的是3.0的,我运行了我的deviceQuery,有2个multiprocessors,192 CUDA Cores/MP:共384CUDA Cores,GPU Clock rate:0.97Ghz,于是float峰值:
3840.972=744.96GFlops
按您所说是这样算的吗?
global void test(float loop, float *out)
{
register float a=1.0f;
register float b=1.0f;
register float c=1.0f;
register float d=1.0f;
register float e=1.0f;
register float f=1.0f;
register float g=1.0f;
register float h=1.0f;
for (float x=0;x<loop;x++)
{
a+=xloop;
b+=xloop;
c+=xloop;
d+=xloop;
e+=xloop;
f+=xloop;
g+=xloop;
h+=xloop;
a+=xloop;
b+=xloop;
c+=xloop;
d+=xloop;
e+=xloop;
f+=xloop;
g+=xloop;
h+=xloop;
a+=xloop;
b+=xloop;
c+=xloop;
d+=xloop;
e+=xloop;
f+=xloop;
g+=xloop;
h+=xloop;
a+=xloop;
b+=xloop;
c+=xloop;
d+=xloop;
e+=xloop;
f+=xloop;
g+=xloop;
h+=xloop;
a+=xloop;
b+=xloop;
c+=xloop;
d+=xloop;
e+=xloop;
f+=xloop;
g+=xloop;
h+=xloop;
}
if (out!=NULL) *out=a+b+c+d+e+f+g+h;
}
int main(int argc, char *argv)
{
float timestamp;
cudaEvent_t event_start,event_stop;
// Initialise
cudaDeviceReset();
cudaSetDevice(0);
cudaThreadSetCacheConfig(cudaFuncCachePreferShared);
// Allocate and generate buffers
cudaEventCreate(&event_start);
cudaEventCreate(&event_stop);
cudaEventRecord(event_start, 0);
dim3 threadsPerBlock;
dim3 blocks;
threadsPerBlock.x=32;
threadsPerBlock.y=32;
threadsPerBlock.z=1;
blocks.x=1;
blocks.y=1000;
blocks.z=1;
test<<<blocks,threadsPerBlock,0>>>(30,NULL);
cudaEventRecord(event_stop, 0);
cudaEventSynchronize(event_stop);
cudaEventElapsedTime(×tamp, event_start, event_stop);
printf(“Calculated in %f\n”, timestamp);
system(“PAUSE”);
}
用这个时间测出的时间timestamp,带入公式:
1000102430*80/timestamp所得值达到了TFlops量级与版主给出的不一致,到底采用哪一个?
如果您是在3.0或者3.5上进行的此测试,您将得到少于标准结果的值。
(最坏可能只有66%)
原因不能说明,抱歉。
但测试不代表实际,实际也不代表峰值。不是吗?
请节哀顺变。(您可以坐等下一代计算能力的显卡,或者暂时回退到上一计算能力)
谢谢版主的回答。但是按您给我的N卡3.X公式算出的标准结果是3840.972=744.96GFlops
而运行的程序得到运行时间是:1.190976
1000102430*80/(1.190976/1000)=2.0635TFlops远远高于理论值
我哪里出错了?求版主解惑。
楼主您好,
这是因为您的初始值都一样,在特定的参数下编译,将会进行公用表达式合并,从而导致错误的时间安排。
目前经过测试,您有2种方式避免此步骤:
(1)将A-H的初始值分别改成:1.0f,2.0f,3.0f…到8.0f
(2)使用已知的暂不会导致合并的参数,例如compute_30,sm_30编译,而不是默认的10(10下会进行公用表达式合并)
建议您使用(1)的建议。避免编译器的行为随时改变。
请立刻重新测试。
感谢来访。
谢谢这个是对的,小于理论值。谢谢版主
恭喜您测试到您期待的结果。
如果您需要非常接近理论值的结果,请您回退到2.x计算能力。或者请您等待maxwell的发布。
感谢您的来访。