OpenHero 开勇's profile开勇 OpenHeroPhotosBlogListsMore Tools Help

Blog


    February 24

    多小的距离才能遇见彼此!

    世界很大,我们所分得的个人空间很小很小……
    clip_image001
    平时埋头苦干,各有各忙。
    clip_image002
    空闲时,我们会聚会一下,耍乐一番。
    clip_image003
    热闹过后,我又感觉特别寂寞,似乎欠了些什么……
    clip_image004
    我们会尝试寻找这欠了的东西。
    clip_image005
    有时不用刻意,却有意外收获!
    clip_image006
    我们会通过琐碎的事发现了对方。
    clip_image007
    我们会互诉心事,开始认识对方。
    clip_image008
    当彼此欣赏、互相靠近的时候,才会发现……
    clip_image009
    我们是来自两个不同高度世界的人。
    clip_image010
    表面上很接近的人……
    clip_image011
    实际上是来自不同高度的世界。
    clip_image012
    生活在不同高度世界的人,有很不同的视野
    clip_image013
    有不同的价值观。
    clip_image014
    遇到障碍时,也很难……
    clip_image015
    很难共同进退!
    clip_image016
    高攀很冒险!
    clip_image017
    屈就很辛苦!
    clip_image018
    如果对方够高,也许会例外!
    clip_image019
    放开眼界时,会发现其他人的距离比我们的还要大很多!
    clip_image020
    如果拥有翅膀,又会怎样?
    clip_image021
    那时候,全世界都属于我们了!
    clip_image022
    或许生活在同一高度的人曾经很接近,却看不见对方。
    clip_image023
    即使遇见,我们又会犹豫……
    clip_image024
    当发觉世界会改变时,我们已经失去了机会。
    clip_image025
    究竟"d"要多细才可以接受?
    clip_image026
    有此人很执著!
    clip_image027
    也有些人,不顾一切地颠倒全世界,去换来同一个世界的感觉。
    clip_image028
    或许,完全生活在同一个世界的就只有自己的影子!

    February 16

    【CUDA比赛】题目征集

     

    【CUDA比赛】题目征集

    准备举行全国的CUDA比赛,希望大家都踊跃参加;

    现在是征集题目,有什么好的想法,有没解决的问题,都可以作为题目,看看大家都会用什么方法来解决;

    有已经解决的问题吗?看看是否别人能用更优化的方法解决?

    欢迎投递任何题目;

    可以和我联系:

    zhao.kaiyong(at)gmail.com

    February 14

    9. CUDA shared memory使用------GPU的革命

    9. CUDA shared memory使用------GPU的革命

    序言:明年就毕业了,下半年就要为以后的生活做打算。这半年,或许就是一个抉择的时候,又是到了一个要做选择的时候。或许是自己的危机意识比较强,一直都觉得自己做得不够好,还需要积累和学习。或许是知足常乐吧,从小山沟,能到香港,一步一步,自己都比较满足,只是心中一直抱着一个理想,坚持做一件事情,坚持想做点事情,踏踏实实,曾经失败过,曾经迷茫过,才学会了坚持,学会了坚毅,才体会了淡定和从容。人生路上,一路走,一路看,一路学,抱着感恩的心,帮助别人,就是帮助自己,未来的路才会更宽……

    正文:书接上文《8. CUDA 内存使用 global 二------GPU的革命》 讲了global内存访问的时候,需要对齐的问题,只有在对齐的情况下才能保证global内存的高效访问。这一章节准备写一下shared memory的访问的问题,首先是讲一下shared的memory的两种使用方法,然后讲解一下shared memory的bank conflict的问题,这个是shared memory访问能否高效的问题所在;

    Shared memory的常规使用:

    1. 使用固定大小的数组:

    /************************************************************************/

    /* Example */

    /************************************************************************/

    __global__ void shared_memory_1(float* result, int num, float* table_1)

    {

    __shared__ float sh_data[THREAD_SIZE];

    int idx = threadIdx.x;

    float ret = 0.0f;

    sh_data[idx] = table_1[idx];

    for (int i = 0; i < num; i++)

    {

    ret += sh_data[idx %BANK_CONFLICT];

    }

    result[idx] = ret;

    }

    这里的sh_data就是固定大小的数组;

    2. 使用动态分配的数组:

    extern __shared__ char array[];

    __global__ void shared_memory_1(float* result, int num, float* table_1, int shared_size)

    {

    float* sh_data = (float*)array; // 这里就让sh_data指向了shared memory的第一个地址,就可以动态分配空间

    float* sh_data2 = (float*)&sh_data[shared_size]; // 这里的shared_size的大小为sh_data的大小;

    int idx = threadIdx.x;

    float ret = 0.0f;

    sh_data[idx] = table_1[idx];

    for (int i = 0; i < num; i++)

    {

    ret += sh_data[idx %BANK_CONFLICT];

    }

    result[idx] = ret;

    }

    这里是动态分配的空间,extern __shared__ char array[];指定了shared的第一个变量的地址,这里其实是指向shared memory空间地址;后面的动态分配float* sh_data = (float*)array;让sh_data指向array其实就是指向shared memory上的第一个地址;

    后面的float* sh_data2 = (float*)&sh_data[shared_size];这里的sh_data2是指向的第一个sh_data的shared_size的地址,就是sh_data就是有了shared_size的动态分配的空间;

    入下图:

    clip_image002

    3. 下面是讲解bank conflict

    我们知道有每一个half-warp是16个thread,然后shared memory有16个bank,怎么分配这16个thread,分别到各自的bank去取shared memory,如果大家都到同一个bank取款,就会排队,这就造成了bank conflict,上面的代码可以用来验证一下bank conflict对代码性能造成的影响:

    /************************************************************************/

    /* Example */

    /************************************************************************/

    __global__ void shared_memory_1(float* result, int num, float* table_1)

    {

    __shared__ float sh_data[THREAD_SIZE];

    int idx = threadIdx.x;

    float ret = 0.0f;

    sh_data[idx] = table_1[idx];

    for (int i = 0; i < num; i++)

    {

    ret += sh_data[idx %BANK_CONFLICT];

    }

    result[idx] = ret;

    }

    // 1,2,3,4,5,6,7.....16

    #define BANK_CONFLICT 16

    这里的BANK_CONFLICT 定义为从1到16的大小,可以自己修改,来看看bank conflict对性能的影响;当BANK_CONFLICT为2的时候,就会通用有8个thread同时访问同一个bank,因为idx%2的取值只有2个0和1,所以16个都会访问bank0和bank1,以此类推,就可以测试整个的性能;

    下面为示意图:

    clip_image004

    当然我们还可以利用16bank conflict,大家都访问同一个bank的同一个数据的时候,就可以形成一个broadcast,那样就会把数据同时广播给16个thread,这样就可以合理利用shared memory的broadcast的机会。

    下面贴出代码,最好自己测试一下;

    /********************************************************************

    * shared_memory_test.cu

    * This is a example of the CUDA program.

    * Author: zhao.kaiyong(at)gmail.com

    * http://blog.csdn.net/openhero

    * http://www.comp.hkbu.edu.hk/~kyzhao/

    *********************************************************************/

    #include <stdio.h>

    #include <stdlib.h>

    #include <cutil.h>

    #include <cutil_inline.h>

    // 1,2,3,4,5,6,7.....16

    #define BANK_CONFLICT 16

    #define THREAD_SIZE 16

    /************************************************************************/

    /* static */

    /************************************************************************/

    __global__ void shared_memory_static(float* result, int num, float* table_1)

    {

    __shared__ float sh_data[THREAD_SIZE];

    int idx = threadIdx.x;

    float ret = 0.0f;

    sh_data[idx] = table_1[idx];

    for (int i = 0; i < num; i++)

    {

    ret += sh_data[idx%BANK_CONFLICT];

    }

    result[idx] = ret;

    }

    /************************************************************************/

    /* dynamic */

    /************************************************************************/

    extern __shared__ char array[];

    __global__ void shared_memory_dynamic(float* result, int num, float* table_1, int shared_size)

    {

    float* sh_data = (float*)array; // 这里就让sh_data指向了shared memory的第一个地址,就可以动态分配空间

    float* sh_data2 = (float*)&sh_data[shared_size]; // 这里的shared_size的大小为sh_data的大小;

    int idx = threadIdx.x;

    float ret = 0.0f;

    sh_data[idx] = table_1[idx];

    for (int i = 0; i < num; i++)

    {

    ret += sh_data[idx%BANK_CONFLICT];

    }

    result[idx] = ret;

    }

    /************************************************************************/

    /* Bank conflict */

    /************************************************************************/

    __global__ void shared_memory_bankconflict(float* result, int num, float* table_1)

    {

    __shared__ float sh_data[THREAD_SIZE];

    int idx = threadIdx.x;

    float ret = 0.0f;

    sh_data[idx] = table_1[idx];

    for (int i = 0; i < num; i++)

    {

    ret += sh_data[idx % BANK_CONFLICT];

    }

    result[idx] = ret;

    }

    /************************************************************************/

    /* HelloCUDA */

    /************************************************************************/

    int main(int argc, char* argv[])

    {

    if ( cutCheckCmdLineFlag(argc, (const char**) argv, "device"))

    {

    cutilDeviceInit(argc, argv);

    }else

    {

    int id = cutGetMaxGflopsDeviceId();

    cudaSetDevice(id);

    }

    float *device_result = NULL;

    float host_result[THREAD_SIZE] ={0};

    CUDA_SAFE_CALL( cudaMalloc((void**) &device_result, sizeof(float) * THREAD_SIZE));

    float *device_table_1 = NULL;

    float host_table1[THREAD_SIZE] = {0};

    for (int i = 0; i < THREAD_SIZE; i++ )

    {

    host_table1[i] = rand()%RAND_MAX;

    }

    CUDA_SAFE_CALL( cudaMalloc((void**) &device_table_1, sizeof(float) * THREAD_SIZE));

    CUDA_SAFE_CALL( cudaMemcpy(device_table_1, host_table1, sizeof(float) * THREAD_SIZE, cudaMemcpyHostToDevice));

    unsigned int timer = 0;

    CUT_SAFE_CALL( cutCreateTimer( &timer));

    CUT_SAFE_CALL( cutStartTimer( timer));

    shared_memory_static<<<1, THREAD_SIZE>>>(device_result, 1000, device_table_1);

    //shared_memory_dynamic<<<1, THREAD_SIZE>>>(device_result, 1000, device_table_1, 16);

    //shared_memory_bankconflict<<<1, THREAD_SIZE>>>(device_result, 1000, device_table_1);

    CUT_CHECK_ERROR("Kernel execution failed\n");

    CUDA_SAFE_CALL( cudaMemcpy(host_result, device_result, sizeof(float) * THREAD_SIZE, cudaMemcpyDeviceToHost));

    CUT_SAFE_CALL( cutStopTimer( timer));

    printf("Processing time: %f (ms)\n", cutGetTimerValue( timer));

    CUT_SAFE_CALL( cutDeleteTimer( timer));

    for (int i = 0; i < THREAD_SIZE; i++)

    {

    printf("%f ", host_result[i]);

    }

    CUDA_SAFE_CALL( cudaFree(device_result));

    CUDA_SAFE_CALL( cudaFree(device_table_1));

    cutilExit(argc, argv);

    }

    这里只是一个简单的demo,大家可以测试一下。下一章节会将一些shared memory的更多的特性,更深入的讲解shared memory的一些隐藏的性质;

    再在接下来的章节会讲一些constant和texture的使用;

    写的内容一直都是文字比较多,代码比较少,其实学习的过程更重要的思想,实践的代码,最好是自己写,唯一可以学习的是思想,学习更重要的也是思想的交流,知识的传播,最好的是思想的传播,代码,方法,都是只是一些工具而已。但是工具的熟练层度,就得靠自己下来多练习。

    February 13

    CUDA __global__ function 参数分析

    在论坛里面讨论到一个问题,__global__函数里面传递的参数,到底是怎么传输到每一个thread的,然后做了以下的一些分析;

    这个是问题讨论帖子:http://topic.csdn.net/u/20090210/22/2d9ac353-9606-4fa3-9dee-9d41d7fb2b40.html

    C/C++ code

    __global__ static void HelloCUDA(char* result, int num)
    {
        __shared__ int i;
        i = 0;
        char p_HelloCUDA[] = "Hello CUDA!";
        for(i = 0; i < num; i++) {
            result[i] = p_HelloCUDA[i];
        }
    }

    
    
    PTX code 

        .const .align 1 .b8 __constant432[12] = {0x48,0x65,0x6c,0x6c,0x6f,0x20,0x43,0x55,0x44,0x41,0x21,0x0};

        .entry _Z9HelloCUDAPci
        {
        .reg .u16 %rh<3>;
        .reg .u32 %r<16>;
        .reg .pred %p<4>;
        .param .u32 __cudaparm__Z9HelloCUDAPci_result;
        .param .s32 __cudaparm__Z9HelloCUDAPci_num;
        .local .align 4 .b8 __cuda___cuda_p_HelloCUDA_168[12];
        .shared .s32 i;
        .loc    14    15    0
    $LBB1__Z9HelloCUDAPci:
        mov.u32     %r1, __constant432;      //
        mov.u32     %r2, __cuda___cuda_p_HelloCUDA_168;    //
        ld.const.u32     %r3, [%r1+0];       // id:17 not_variable+0x0
        st.local.u32     [%r2+0], %r3;       // id:18 __cuda___cuda_p_HelloCUDA_168+0x0
        ld.const.u32     %r4, [%r1+4];       // id:17 not_variable+0x0
        st.local.u32     [%r2+4], %r4;       // id:18 __cuda___cuda_p_HelloCUDA_168+0x0
        ld.const.u32     %r5, [%r1+8];       // id:17 not_variable+0x0
        st.local.u32     [%r2+8], %r5;       // id:18 __cuda___cuda_p_HelloCUDA_168+0x0
        .loc    14    20    0
        mov.s32     %r6, 0;                  //
        ld.param.s32     %r7, [__cudaparm__Z9HelloCUDAPci_num];    // id:16 __cudaparm__Z9HelloCUDAPci_num+0x0
        mov.u32     %r8, 0;                  //
        setp.le.s32     %p1, %r7, %r8;       //
        @%p1 bra     $Lt_0_9;                //
        mov.s32     %r9, %r7;                //
        mov.u32     %r10, __cuda___cuda_p_HelloCUDA_168;    //
        mov.u32     %r11, __cuda___cuda_p_HelloCUDA_168;    //
        add.u32     %r12, %r7, %r11;         //
        ld.param.u32     %r13, [__cudaparm__Z9HelloCUDAPci_result];    // id:19 __cudaparm__Z9HelloCUDAPci_result+0x0
        mov.s32     %r14, %r9;               //
    $Lt_0_7:
    //<loop> Loop body line 20, nesting depth: 1, estimated iterations: unknown
        .loc    14    21    0
        ld.local.s8     %rh1, [%r10+0];      // id:20 __cuda___cuda_p_HelloCUDA_168+0x0
        st.global.s8     [%r13+0], %rh1;     // id:21
        add.u32     %r13, %r13, 1;           //
        add.u32     %r10, %r10, 1;           //
        setp.ne.s32     %p2, %r10, %r12;     //
        @%p2 bra     $Lt_0_7;                //
        st.shared.s32     [i], %r7;          // id:22 i+0x0
        bra.uni     $Lt_0_5;                 //
    $Lt_0_9:
        st.shared.s32     [i], %r6;          // id:22 i+0x0
    $Lt_0_5:
        .loc    14    23    0
        exit;                             //
    $LDWend__Z9HelloCUDAPci:
        } // _Z9HelloCUDAPci
    
    
    Cubin code

    architecture {sm_10}
    abiversion   {1}
    modname      {cubin}
    consts {
            name    = __constant432
            segname = const
            segnum  = 0
            offset  = 0
            bytes   = 12
        mem {
            0x6c6c6548 0x5543206f 0x00214144
        }
    }
    code {
        name = _Z9HelloCUDAPci
        lmem = 12
        smem = 28  // 我们注意这里的smem 的数量
        reg  = 3
        bar  = 0
        bincode {
            0x10000001 0x2400c780 0xd0000001 0x60c00780
            0x10000201 0x2400c780 0xd0000801 0x60c00780
            0x10000401 0x2400c780 0x307ccbfd 0x6c20c7c8
            0xd0001001 0x60c00780 0x10014003 0x00000280
            0x1000f801 0x0403c780 0x1000c805 0x0423c780
            0x00000005 0xc0000780 0xd4000009 0x40200780
            0x20018001 0x00000003 0xd00e0209 0xa0200780
            0x3000cbfd 0x6c2147c8 0x20018205 0x00000003
            0x1000a003 0x00000280 0x1000ca01 0x0423c780
            0x00000c01 0xe4200780 0x30000003 0x00000780
            0x00000c01 0xe43f0781
        }
    }


    这个是一段加了shared memory的也有constant 的ptx代码~还有cubin

     

    从cubin来看,确实有可能是通过global memory进来的,不过一定是分发到各自的.param变量里面去的,因为在每一个thread 里面都是可以修改传进来的参数的;
    从这点来看:大体应该是 参数( global memory--> (constant memory or shared memory) 然后broadcast to each thread--> 每一个thread都各自的register里面有了参数
    大体应该是这样一个过程;

    February 05

    中国百句经典名言

    1 .天行健,君子以自强不息。 —— 《周易》
    译:作为君子,应该有坚强的意志,永不止息的奋斗精神,努力加强自我修养,完成并发展自己的学业或事业,能这样做才体现了天的意志,不辜负宇宙给予君子的职责和才能。
    2 .勿以恶小而为之,勿以善小而不为。 —— 《三国志》
    译:对任何一件事,不要因为它是很小的、不显眼的坏事就去做;相反,对于一些微小的。却有益于别人的好事,不要因为它意义不大就不去做它。
    3 .见善如不及,见不善如探汤。 —— 《论语》
    译:见到好的人,生怕来不及向他学习,见到好的事,生怕迟了就做不了。看到了恶人、坏事,就像是接触到热得发烫的水一样,要立刻离开,避得远远的。
    4 .躬自厚而薄责于人,则远怨矣。 —— 《论语》
    译:干活抢重的,有过失主动承担主要责任是“ 躬自厚” ,对别人多谅解多宽容,是“ 薄责于人” ,这样的话,就不会互相怨恨。
    5 .君子成人之美,不成人之恶。小人反是。 —— 《论语》
    译:君子总是从善良的或有利于他人的愿望出发,全心全意促使别人实现良好的意愿和正当的要求,不会用冷酷的眼光看世界。或是唯恐天下不乱,不会在别人有失败、错误或痛苦时推波助澜。小人却相反,总是“ 成人之恶,不成人之美” 。
    6 .见贤思齐焉,见不贤而内自省也。 —— 《论语》
    译:见到有人在某一方面有超过自己的长处和优点,就虚心请教,认真学习,想办法赶上他,和他达到同一水准;见有人存在某种缺点或不足,就要冷静反省,看自己是不是也有他那样的缺点或不足。
    7 .己所不欲,勿施于人。 —— 《论语》
    译:自己不想要的(痛苦、灾难、祸事…… ),就不要把它强加到别人身上去。
    8 .当仁,不让于师。 —— 《论语》
    译:遇到应该做的好事,不能犹豫不决,即使老师在一旁,也应该抢著去做。后发展为成语“ 当仁不让” 。
    9 .君子欲讷于言而敏于行。 —— 《论语》
    译:君子不会夸夸其谈,做起事来却敏捷灵巧。
    10 .二人同心,其利断金;同心之言,其臭如兰。 —— 《周易》
    译:同心协办的人,他们的力量足以把坚硬的金属弄断;同心同德的人发表一致的意见,说服力强,人们就像嗅到芬芳的兰花香味,容易接受。
    11 .君子藏器于身,待时而动。 —— 《周易》
    译:君子就算有卓越的才能超群的技艺,也不会到处炫耀、卖弄。而是在必要的时刻把才能或技艺施展出来。
    12 .满招损,谦受益。 —— 《尚书》
    译:自满于已获得的成绩,将会招来损失和灾害;谦逊并时时感到了自己的不足,就能因此而得益。
    13 .人不知而不愠,不亦君子乎? —— 《论语》
    译:如果我有了某些成就,别人并不理解,可我决不会感到气愤、委屈。这不也是一种君子风度的表现吗?
    14 .言必信 ,行必果。 —— 《论语》
    译:说了的话,一定要守信用;确定了要干的事,就一定要坚决果敢地干下去。
    15 .毋意,毋必,毋固,毋我。 —— 《论语》
    译:讲事实,不凭空猜测;遇事不专断,不任性,可行则行;行事要灵活,不死板;凡事不以“ 我” 为中心,不自以为是,与周围的人群策群力,共同完成任务。
    16 .三有我师焉,择其善者而从之,其不善者而改之。—— 《论语》
    译:三个人在一起,其中必有某人在某方面是值得我学习的,那他就可当我的老师。我选取他的优点来学习。
        17 .君子求诸己,小人求诸人。 —— 《论语》
    译:君子总是责备自己,从自身找缺点,找问题。小人常常把目光射向别人,找别人的缺点和不足。
    18 .君子坦荡荡,小人长戚戚。 —— 《论语》
    译:君子心胸开朗,思想上坦率洁净,外貌动作也显得十分舒畅安定。小人心里欲念太多,心理负担很重,就常忧虑、担心,外貌、动作也显得忐忑不安,常是坐不定,站不稳的样子。
    19 .不怨天,不尤人。 —— 《论语》
    译:遇到挫折与失败,绝不从客观上去找借口,绝不把责任推向别人,后来发展为成语“ 怨天尤人” 。
    20 .不迁怒,不贰过。 —— 《论语》
    译:犯了错误,不要迁怒别人,并且不要再犯第二次。
    21 .小不忍,则乱大谋。 —— 《论语》
    译:不该干的事,即使很想去干,但坚持不干,叫“ 忍” 。对小事不忍,没忍性,就会影响大局,坏了大事。
    22 .小人之过也必文。 —— 《论语》
    译:小人对自己的过错必定加以掩饰。
    23 .过而不改,是谓过矣。 —— 《论语》
    译:有了过错而不改正,这就是真的过错了。
    24 .君子务本,本立而道生。 —— 《论语》
    译:君子致力于根本,确立了根本,“ 道” 也就自然产生。
    25 .君子耻其言而过其行。 —— 《论语》
    译:君子认为说得多做得少是可耻的。
    26 .三级笮小? —— 《论语》
    译:每做一件事情必须要经过反复的考虑后才去做。
    27 .多行不义必自毙。 —— 《左传》
    译:坏事做得太多,终将自取灭亡。
    28 .人谁无过,过而能改,善莫大焉。 —— 《左传》
    译:人都有可能犯错误,犯了猎误,只要改正了仍是最好的人。
    29 .不以一眚掩大德。 —— 《左传》
    译:评价一个人时,不能因为一点过失就抹杀他的功劳。
    30 .人一能之,己百之;人十能之,己千之。 —— 《中庸》
    译:人家一次就学通的,我如果花上百次的功夫,一定能学通。人家十次能掌握的,我要是学一千次,也肯定会掌握的。
    31 .知耻近乎勇。 —— 《中庸》
    译:知道什么是可耻的行为,那就是勇敢的好表现。
    32 .以五十步笑百步。 —— 《孟子》
    译:以为自己的错误比别人的小,缺点比别人少而沾沾自喜。
    33 .君子莫大乎与人为善。 —— 《孟子》
    译:君子最大的长处就是用高尚、仁义的心去对待别人。
    34 .人皆可以为尧舜。 —— 《孟子》
    译:只要肯努力去做,人人都可以成为尧舜那样的大圣人。
    35 .千丈之堤,以蝼蚁之穴溃;百尺之室,以突隙之烟焚。 —— 《韩非子》
    译:千里大堤,因为有蝼蚁在打洞,可能会因此而塌掉决堤;百尺高楼,可能因为烟囱的缝隙冒出火星引起火灾而焚毁。
    36 .言之者无罪,闻之者足以戒。 —— 《诗序》
    译:提出批评意见的人,是没有罪过的。听到别人的批评意见要仔细反省自己,有错就改正,无错就当作是别人给自己的劝告。
    37 .良药苦于口而利于病,忠言逆于耳而利于行。 —— 《孔子家语》
    译:好的药物味苦但对治病有利;忠言劝诫的话听起来不顺耳却对人的行为有利。
    38 .良言一句三冬暖,恶语伤人六月寒。 —— 明代谚语
    译:一句良善有益的话,能让听者即使在三冬严寒中也倍感温暖;相反,尖酸刻薄的恶毒语言,伤害别人的感情和自尊心,即使在六月大暑天,也会让人觉得寒冷。
    39 .千经万典,孝悌为先。 —— 《增广贤文》
    译:千万种经典讲的道理,孝顺父母,友爱兄弟是最应该先做到的。
    40 .善恶随人作,祸福自己招, —— 《增广贤文》
    译:好事坏事都是自己做的,灾祸 幸福 也全是由自己的言行招来的。
    41. 学而不思罔,思而不学则殆。 —— 《论语》
    译:只学习却不思考就不会感到迷茫,只空想却不学习就会疲倦而没有收获。
    42. 知之为知之,不知为不知,是知也。 —— 《论语》
    译:知道就是知道,不知道应当说 不知道,不弄虚作假,这才是明智的行为。
    43. 业精于勤,荒于嬉;行成于思,毁于随。 —— 韩愈
    译:事业或学业的 成功 在于奋发努力,勤勉进取。太贪玩,放松要求便会一事无成;做人行事,必须谨慎思考,考虑周详才会有所成就。任性、马虎、随便只会导致失败。
    44. 读书有三到:谓心到,眼到,口到。 —— 朱熹
    译:用心思考,用眼仔细看,有口多读,三方面都做得到位才是真正的读书。
    45. 学而不厌,诲人不倦。 —— 《论语》
    译:努力学习却不感到满足,教导别人不感到厌倦。
    46. 不积跬步,无以至千里,不积小流,无以成江海。 —— 《荀子》
    译:不把半步、一步积累起来,就不能走到千里远的地方,不把细流汇聚起来,就不能形成江河大海。
    47. 欲穷千里目,更上一层楼。 —— 王之涣
    译:想看到更远更广阔的景物,你就要再上一层楼。想学到更多更深的知识,你就要比原来更努力。
    48. 强中自有强中手,莫向人前满自夸。 —— 《警世通言》
    译:尽管你是一个强者,可是一定还有比你更强的人,所以不要在别人面前骄傲自满,自己夸耀自己。
    49. 玉不琢,不成器;人不学,不知道。 —— 《礼记. 学记》
    译:玉石不经过雕琢,不能成为有用的玉器;人不经过学习,就不懂得事理。
    50. 黑发不知勤学早,白首方悔读书迟。 —— 《劝学》
    译:年轻的时候不知道抓紧 时间 勤奋学习,到老了想读书却为时已晚。
    51. 知不足者好学,耻下问者自满。 —— 林逋《省心录》
    译:知道自己的不足并努力学习就是聪明的人,不好问又骄傲自满的人是可耻的。
    52. 学不可以已。 —— 《荀子》
    译:学习是不可以停止的。
    53. 学而时习之,不亦悦乎? —— 《论语》
    译:学过的知识,在适当的时候去复习它,使自己对知识又有了新的认识,这不是令人感到 快乐 的事吗?
    54. 温故而知新,可以为师矣。 —— 《论语》
    译:学了新的知识又常常温习已学过的知识,不断地学习,温习,学问和修养一定会很快得到提高,这样的人就可以成为老师了。
    55. 读书破万卷,下笔如有神。 —— 杜甫
    译:读书读得多,写起文章来就会笔下生花,像有神助一样。
    56. 少壮不努力,老大徒伤悲。 —— 《汉乐府. 长歌行》
    译:年轻时不努力学习,年老了只能后悔、歎息。
    57. 读书百遍而义自见。 —— 《三国志》
    译:读书必须反复多次地读,这样才能明白书中所讲的意思。
    58. 学而不化,非学也。 —— 杨万里
    译:学习知识但不能灵活运用,不能称为学习。
    59. 好学而不贰。 —— 《左传》
    译:爱好学习但不三心二意。
    60. 学如不及,犹恐失之。
    译:学习知识时生怕追不上,追上了又害怕再失去。

    61. 人而不学,其犹正墙面而立。 —— 《尚书》
    译:人如果不学习,就像面对墙壁站著,什么东西也看不见。
    62 、知而好问,然后能才。 —— 《荀子》
    译:聪明的人还一定得勤学好问才能成才。
    63 、学之广在于不倦,不倦在于固志。 —— 葛洪
    译:学问的渊博在于学习时不知道厌倦,而学习不知厌倦在于有坚定的目标。
    64. 学而不知道,与不学同;知而不能行,与不知同。 —— 黄睎
    译:学习知识不能从中明白一些道理,这和不学习没什么区别;学到了道理却不能运用,这仍等于没有学到道理。
    65. 博观而约取,厚积而薄发。 —— 苏轼
    译:广泛阅读,多了解古今中外的人和事,把其中好的部分牢牢记住;积累了大量的知识材料,到需要用时便可以很自如恰当地选择运用。
    66. 差之毫厘,缪以千里。 —— 陆九渊
    译:做任何事情,开始一定要认真地做好,如果做差了一丝一毫,结果会发现相差很远。
    67. 盛年不重来,一日难再晨。 —— 陶渊明
    译:美好的青春年华过去了就不会再来,一天不可能有两个早晨,要珍惜时光啊!)
    68 、言之无文,行而不远。 —— 《左传》
    译:文章讲的内容或题材都很好,可表达不适当,那么欣赏的人就不会很多,难以传播千古。
    69. 人之为学,不可自小,又不可自大。 —— 顾炎武
    译:学习时不要在渊博浩翰的知识面前感到自卑,也不能因为学到一点点知识而骄傲自满。
    70. 好学近乎知,力行近乎仁,知耻近乎勇。 —— 《中庸》
    译:勤奋好学就接近智,做任何事情只要努力就接近仁,懂得了是非善恶就是勇的一种表现。
    71. 书到用时方恨少,事非经过不知难。 —— 陈廷焯
    译:知识总是在运用时才让人感到太不够了,许多事情如果不亲身经历过就不知道它有多难。
    72 、笨鸟先飞早入林,笨人勤学早成材。 —— 《省世格言》
    译:飞得慢的鸟儿提早起飞就会比别的鸟儿早飞入树林,不够聪明的人只要勤奋努力,就可以比别人早成材。
    73. 书山有路勤为径,学海无涯苦作舟。 —— 《增广贤文》
    译:勤奋是登上知识高峰的一条捷径,不怕吃苦才能在知识的海洋里自由遨游。
    74. 学如逆水行舟,不进则退。 —— 《增广贤文》
    译:学习要不断进取,不断努力,就像逆水行驶的小船,不努力向前,就只能向后退。
    75. 吾生也有涯而,知也无涯。 —— 《庄子》
    译:我的生命是有限的,而人类的知识是无限的。
    76. 天下兴亡,匹夫有责。 —— 顾炎武
    译:国家的兴旺、衰败,每一个人都负有很大的责任。
    77. 生于忧患,死于安乐。 —— 孟子
    译:逆境能使人的意志得到磨炼,使人更坚强。相反,时常满足于享受,会使人不求上进而逐渐落后。
    78. 位卑未敢忘国。 —— 陆游《病起书怀》
    译:虽然自己地位低微,但是从没忘掉忧国忧民的责任。
    79. 人生自古谁无死,留取丹心照汉青。 —— 文天祥《过零丁洋》
    译:自古以来,谁都难免会死的,那就把一片爱国的赤胆忠心留在史册上吧!
    80. 先天下之忧而忧,后天下乐而乐。 —— 范仲淹《岳阳楼记》
    译:为国家分忧时,比别人先,比别人急;享受幸福,快乐时,却让别人先,自己居后。
    81. 小来思报国,不是爱封侯。 —— 唐. 岑参《关人赴安西》
    译:从小就想著报效祖国,而不是想著要封侯当官。
    82. 有益国家之事虽死弗避。 —— 明. 吕坤《呻吟语. 卷上》
    译:对国家有利的事情要勇敢地去做,就算有死亡的危险也不躲避。
    83. 一寸山河一寸金。 —— 金. 左企弓语
    译:祖国的每一寸山河比一寸黄金还要宝贵,是绝不能让给外人的。
    84. 欲安其家,必先安于国。 —— 武则天
    译:如果想建立个人幸福的小家,必须先让国定安定,繁荣起来。
    85. 捐躯赴国难,视死忽如归。 —— 三国. 曹植《白马篇》
    译:在国家有危难的时候要敢于挺身而出,把死当作回家一样。
    86. 风声、雨声、读书声,声声入耳;家事、国事、天下事,事事关心。 —— 明. 顾宪成
    译:风声、雨声、琅琅读书声,都进入我们的耳朵,所以,作为一个读书人,家事、国事,天下的事情,各种事情都应该关心,不能只是死读书。
    87. 生当作人杰,死亦为鬼雄。 —— 李清照《夏日绝句》
    译:活著的时候要做英雄,死后也要当英雄。
    88. 利于国者爱之,害于国者恶之。 —— 《晏子春秋》
    译:对于国家有利的事就要热心地去做,对国家有害的事就要憎恶它,远离它。
    89. 读书本意在元元。 —— 宋. 陆)
    译:读书的目的应该是掌握了知识后为社会和大众服务,而不是为了自己的升官发财。
    90. 时穷节乃现,一一垂丹青。 —— 宋. 文天祥
    译:历史上许多忠臣义士,在国家有难时,他们的节操就显现出来,一个个名垂史册。
    91. 哀哀父母,生我劬劳。 —— 《诗经》
    译:想起父母,做子女的是多么为他们感到心痛啊!他们生我育我,花费了多少辛勤的劳动啊!
    92. 报国之心,死而后已。—— 宋. 苏轼
    译:报效祖国的志向到死都不会变。
    93. 忧国忘家,捐躯济难,忠臣之志也。 —— 三国. 曹植《求自诚表》
    译:忧虑国家大事忘记小家庭,为拯救国家危难而捐躯献身,这都是忠臣的志向。
    94. 大丈夫处世,当扫除天下,安事一室乎? —— 汉. 陈蕃语
    译:有志气的人活在世上,应当敢于跟各种不利于国家的行为作斗争,哪能只满足于处理好自己小家的小事呢?
    95. 君子之交淡如水,小人之交甘若醴。 —— 《庄子》
    译:君子之间的交往,像水一样的平淡、纯净,这样的友谊才会持久;往小人之间的交像甜酒一样的又浓又稠,但不会长久。
    96. 老吾老,以及人之老;幼吾幼,以及人之幼。 —— 《孟子》
    译:尊敬、爱戴别人的长辈,要像尊敬、爱戴自己长辈一样;爱护别人的儿女,也要像爱护自己的儿女一样。
    97. 见侮而不斗,辱也。 —— 《公孙龙子》
    译:当正义遭到侮辱、欺凌却不挺身而出,是一种耻辱的表现。
    98. 天下皆知取之为取,而莫知与之为取。 —— 《后汉书》
    译:人们都认为只有获取别人的东西才是收获,却不知道给予别人也是一种收获。
    99. 人固有一死,死或重于泰山,或轻于鸿毛。 —— 汉. 司马迁
    译:人终究免不了一死,但死的价值不同,为了人民正义的事业而死就比泰山还重,而那些自私自利,损人利已的人之死就比鸿毛还轻。
    100. 羊有跪乳之恩,鸦有反哺之义。 —— 《增广贤文》
    译:羊羔有跪下接受母乳的感恩举动,小乌鸦有衔食喂母鸦的情义,做子女的更要懂得孝顺父母。