查看完整版本 : 小試驗

Susan﹏汪汪 2017-11-9 12:49 PM

小試驗

汪汪一直都以為用pointer += 1呢個方法通常會快過用[]
不過一直認真冇求證過

簡單寫左段code[code]#include <iostream>
#include <ctime>

double buffer[1 << 20];

void test1() {
   
    double *p = buffer;
   
    for (int i = 0; i < 1 << 20; ++i) {
        p[i] += 1;
    }
}

void test2() {
   
    double *p = buffer;
   
    for (int i = 0; i < 1 << 20; ++i) {
        *p += 1;
        p += 1;
    }
}

int main(int argc, const char * argv[]) {
   
    clock_t t;
   
    {
        
        t = clock();
        
        test1();
        
        t = clock() - t;
        
        std::cout << "t1: " << (double)t / CLOCKS_PER_SEC << "\n";
        
    }
   
    {
        
        t = clock();
        
        test2();
        
        t = clock() - t;
        
        std::cout << "t2: " << (double)t / CLOCKS_PER_SEC << "\n";
        
    }
   
    return 0;
}[/code]時間係[code]t1: 0.00387
t2: 0.001089[/code]swift都有相類似的結果

ncream 2017-11-9 12:54 PM

[quote]原帖由 [i]Susan﹏汪汪[/i] 於 2017-11-9 12:49 PM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=470613100&ptid=27047082][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]
汪汪一直都以為用pointer += 1呢個方法通常會快過用[]
不過一直認真冇求證過

簡單寫左段code#include
#include

double buffer[1  [/quote]

又學到野,試下先。

Susan﹏汪汪 2017-11-9 01:13 PM

[quote]原帖由 [i]ncream[/i] 於 2017-11-9 12:54 PM 發表 [url=http://www.discuss.com.hk/redirect.php?goto=findpost&pid=470613394&ptid=27047082][img]http://www.discuss.com.hk/images/common/back.gif[/img][/url]


又學到野,試下先。 [/quote]
係見你同煙民好中意用方括號
所以先寫呢個test

汪汪一向用+=去move pointer

jasonchan35 2017-11-9 02:01 PM

無埋個 counter 'i' 會仲快, 所以 std::vector 入面係儲係用 m_begin, m_end, 唔係 m_data, m_size

auto* e = p + (1 << 20)
for (;p < e; p++) {
   *p += 1;
}

ncream 2017-11-9 02:11 PM

[quote]原帖由 [i]Susan﹏汪汪[/i] 於 2017-11-9 01:13 PM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=470614290&ptid=27047082][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]

係見你同煙民好中意用方括號
所以先寫呢個test

汪汪一向用+=去move pointer [/quote]

有問題啊﹗師姐::smile_o16::smile_o16:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

static unsigned int mt[624];
static unsigned int mt_index;


void initialize_mt19937(unsigned int seed) {
    mt[0] = seed;
    for(unsigned int i = 1; i < 624; ++i) {
        mt = (1812433253 * (mt[i - 1] ^ (mt[i - 1] >> 30)) + i) & 0xffffffff;
    }
}

unsigned int mt19937_rand() {
   
    if (mt_index == 0) {
        for(unsigned int i = 0; i < 624; ++i) {
            unsigned int y = (mt & 0x80000000) + (mt[(i + 1) % 624] & 0x7FFFFFFF);
            mt = mt[(i + 397) % 624] ^ (y >> 1);
            if(y % 2 != 0) {
                mt ^= 0x9908b0df;
            }
        }
    }
   
    unsigned int y = mt[mt_index];
    y ^= y >> 11;
    y ^= (y << 7) & 0x9d2c5680;
    y ^= (y << 15) & 0xefc60000;
    y ^= y >> 18;
   
    mt_index = (mt_index + 1) % 624;
    return y;
}

int main() {

  clock_t start, end;
   
  long *dynArr, *dynArr2;

  long arrLen = 100000000;
  dynArr = (unsigned int*)malloc( arrLen * sizeof(unsigned int) );
  dynArr2 = (long*)malloc( arrLen * sizeof(int) );

  if( dynArr == NULL ) {

fprintf(stderr, "Error: unable to allocate required memory\n");

return 1;
  }

  long i, j, k, m, r, s;

  printf("Please input the seed of mt19937: ");
  scanf("%d",&j);

  // Start Record the time
  start = clock();

  initialize_mt19937(j);

[color=#ff0000]  for (i = 0; i < arrLen; ++i){


//dynArr = mt19937_rand() %100000000; 就係呢到!!!!!


long *p = dynArr;

*p +=1;

p = mt19937_rand() %100000000;
}[/color]

   // Record the end time
    end = clock();
    double diff = end - start; // ms

    for (i = 0; i < 100 ; i++)

printf("%d  ", dynArr);


printf("\n\n");

    printf("gens random nums copy to memory, time used: %f ms\n\n" , diff);


    free(dynArr);
    free(dynArr2);

    return 0;
}

[上面REMART左個到,唔WORK:smile_o16::smile_o16:

[[i] 本帖最後由 ncream 於 2017-11-9 02:15 PM 編輯 [/i]]

Susan﹏汪汪 2017-11-9 02:12 PM

[quote]原帖由 [i]ncream[/i] 於 2017-11-9 02:11 PM 發表 [url=http://www.discuss.com.hk/redirect.php?goto=findpost&pid=470617077&ptid=27047082][img]http://www.discuss.com.hk/images/common/back.gif[/img][/url]


有問題啊﹗師姐::smile_o16::smile_o16:

#include
#include
#include

static unsigned int mt[624];
static unsigned int mt_index;


void initialize_mt19937(unsigned int seed) {
    mt[0 ... [/quote]
用[ code]包住D code

變晒斜體字

ncream 2017-11-9 02:15 PM

[quote]原帖由 [i]Susan﹏汪汪[/i] 於 2017-11-9 02:12 PM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=470617129&ptid=27047082][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]

用[ code]包住D code

變晒斜體字 [/quote]
變返正體。:smile_o12:

ncream 2017-11-9 02:17 PM

[quote]原帖由 [i]jasonchan35[/i] 於 2017-11-9 02:01 PM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=470616649&ptid=27047082][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]
auto* e = p + (1 << 20)
for (;p < e; p++) {
   *p += 1;
}
[/quote]

c無auto。:smile_o16:

int *e = p + (1 << 20)
     for (;p < e; p++) {
          *p += 1;
          p=1;
  }


係C到WORK唔WORK呢?

[[i] 本帖最後由 ncream 於 2017-11-9 02:19 PM 編輯 [/i]]

Susan﹏汪汪 2017-11-9 02:21 PM

[quote]原帖由 [i]ncream[/i] 於 2017-11-9 02:15 PM 發表 [url=http://www.discuss.com.hk/redirect.php?goto=findpost&pid=470617239&ptid=27047082][img]http://www.discuss.com.hk/images/common/back.gif[/img][/url]

變返正體。:smile_o12: [/quote]
係用[ code]包住D code

[code]my code[/code]

你段code食晒所有方括[ i]

ncream 2017-11-9 02:23 PM

[quote]原帖由 [i]Susan﹏汪汪[/i] 於 2017-11-9 02:21 PM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=470617512&ptid=27047082][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]

係用[ code]包住D code

my code

你段code食晒所有方括[ i] [/quote]


[url=https://www.sendspace.com/file/6igm6r]https://www.sendspace.com/file/6igm6r[/url]

直接比你無咁煩。:smile_o12:

Susan﹏汪汪 2017-11-9 02:24 PM

[quote]原帖由 [i]ncream[/i] 於 2017-11-9 02:23 PM 發表 [url=http://www.discuss.com.hk/redirect.php?goto=findpost&pid=470617603&ptid=27047082][img]http://www.discuss.com.hk/images/common/back.gif[/img][/url]



https://www.sendspace.com/file/6igm6r

直接比你無咁煩。:smile_o12: [/quote]
汪汪一向用手機上香討

Susan﹏汪汪 2017-11-9 02:27 PM

[quote]原帖由 [i]ncream[/i] 於 2017-11-9 02:23 PM 發表 [url=http://www.discuss.com.hk/redirect.php?goto=findpost&pid=470617603&ptid=27047082][img]http://www.discuss.com.hk/images/common/back.gif[/img][/url]



https://www.sendspace.com/file/6igm6r

直接比你無咁煩。:smile_o12: [/quote]
你個[code]long *p = dynArr;[/code]放左係for loop入面

ncream 2017-11-9 02:28 PM

[url]http://rextester.com/HHQWB10536[/url]

[[i] 本帖最後由 ncream 於 2017-11-9 02:31 PM 編輯 [/i]]

Susan﹏汪汪 2017-11-9 02:31 PM

[quote]原帖由 [i]ncream[/i] 於 2017-11-9 02:28 PM 發表 [url=http://www.discuss.com.hk/redirect.php?goto=findpost&pid=470617811&ptid=27047082][img]http://www.discuss.com.hk/images/common/back.gif[/img][/url]
貼極都唔掂。垃圾野。算吧啦。 [/quote]
你㩒入去edit汪汪的post

睇睇汪汪點post code

ncream 2017-11-9 02:33 PM

[quote]原帖由 [i]Susan﹏汪汪[/i] 於 2017-11-9 02:31 PM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=470617956&ptid=27047082][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]

你㩒入去edit汪汪的post

睇睇汪汪點post code [/quote]



C:\sort>g++ -static-libgcc -O3 sort.c -o sort
sort.c: In function 'int main()':
sort.c:68:21: error: invalid conversion from 'unsigned int' to 'long int*' [-fpermissive]
  p = mt19937_rand() %100000000;


[url]http://rextester.com/COK25219[/url]

Susan﹏汪汪 2017-11-9 02:35 PM

[quote]原帖由 [i]ncream[/i] 於 2017-11-9 02:33 PM 發表 [url=http://www.discuss.com.hk/redirect.php?goto=findpost&pid=470618039&ptid=27047082][img]http://www.discuss.com.hk/images/common/back.gif[/img][/url]




C:\sort>g++ -static-libgcc -O3 sort.c -o sort
sort.c: In function 'int main()':
sort.c:68:21: error: invalid conversion from 'unsigned int' to 'long int*' [-fpermissive]
  p = mt19937_rand( ... [/quote]
[code]    long *p = dynArr;
    for (i = 0; i < arrLen; ++i){
        *p = mt19937_rand() %100000000;
        p +=1;
    }[/code]

ncream 2017-11-9 02:38 PM

[quote]原帖由 [i]Susan﹏汪汪[/i] 於 2017-11-9 02:35 PM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=470618092&ptid=27047082][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]

    long *p = dynArr;
    for (i = 0; i < arrLen; ++i){
        *p = mt19937_rand() %100000000;
        p +=1;
    } [/quote]

分別唔係好大。

sort 係 pointer, sort2 係array[]

[attach]7545509[/attach]

Susan﹏汪汪 2017-11-9 02:39 PM

[quote]原帖由 [i]ncream[/i] 於 2017-11-9 02:38 PM 發表 [url=http://www.discuss.com.hk/redirect.php?goto=findpost&pid=470618206&ptid=27047082][img]http://www.discuss.com.hk/images/common/back.gif[/img][/url]


分別唔係好大。

sort 係 pointer, sort2 係array[]

[/quote]
Bottleneck係memory 到的話先會可能有明顯分別

ncream 2017-11-9 02:40 PM

[quote]原帖由 [i]Susan﹏汪汪[/i] 於 2017-11-9 02:39 PM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=470618264&ptid=27047082][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]

Bottleneck係memory 到的話先會可能有明顯分別 [/quote]

明白。:smile_o06:

ncream 2017-11-9 02:49 PM

[quote]原帖由 Susan﹏汪汪 於 2017-11-9 02:39 PM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=470618264&ptid=27047082][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]

Bottleneck係memory 到的話先會可能有明顯分別 [/quote]


[url=http://rextester.com/VHEWEY7087]http://rextester.com/VHEWEY7087[/url]

[[i] 本帖最後由 ncream 於 2017-11-9 02:51 PM 編輯 [/i]]

Susan﹏汪汪 2017-11-9 02:51 PM

[quote]原帖由 [i]jasonchan35[/i] 於 2017-11-9 02:01 PM 發表 [url=http://www.discuss.com.hk/redirect.php?goto=findpost&pid=470616649&ptid=27047082][img]http://www.discuss.com.hk/images/common/back.gif[/img][/url]
無埋個 counter 'i' 會仲快, 所以 std::vector 入面係儲係用 m_begin, m_end, 唔係 m_data, m_size

auto* e = p + (1  [/quote]
雖然係咁講

不過汪汪寫的code差不多都係Bottleneck係memory 到

個counter冇乜影響力

最難搞的係汪汪主要用double type做運算
而且通常係packed 2~4個double

結果只係讀同寫memory 都遠遠超過加減乘除的速度

ncream 2017-11-9 02:52 PM

[quote]原帖由 [i]Susan﹏汪汪[/i] 於 2017-11-9 02:51 PM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=470618765&ptid=27047082][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]

雖然係咁講

不過汪汪寫的code差不多都係Bottleneck係memory 到

個counter冇乜影響力

最難搞的係汪汪主要用double type做運算
而且通常係packed 2~4個double

結果只係讀同寫memory 都遠遠超過加減乘除的速度 [/quote]


呢到

[url]http://rextester.com/VHEWEY7087[/url]

Susan﹏汪汪 2017-11-9 02:54 PM

[quote]原帖由 [i]ncream[/i] 於 2017-11-9 02:49 PM 發表 [url=http://www.discuss.com.hk/redirect.php?goto=findpost&pid=470618682&ptid=27047082][img]http://www.discuss.com.hk/images/common/back.gif[/img][/url]



[url=http://rextester.com/VHEWEY7087]http://rextester.com/VHEWEY7087[/url] [/quote]
dynArr2冇辦法改
dynArr先得

Move pointer快係因為順序咁去讀
呢個就係之前講cache的問題

dynArr2係random access
冇辦法寫成move pointer

[[i] 本帖最後由 ncream 於 2017-11-9 03:13 PM 編輯 [/i]]

ncream 2017-11-9 02:57 PM

[quote]原帖由 [i]Susan﹏汪汪[/i] 於 2017-11-9 02:54 PM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=470618914&ptid=27047082][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]

dynArr2冇辦法改
dynArr先得

Move pointer快係因為順序咁去讀
呢個就係之前講cache的問題

dynArr2係random access
冇辦法寫成move pointer

THANKS:smile_o06::smile_o06:

多謝指教。 [/quote]


[url=http://rextester.com/WJX47598]http://rextester.com/WJX47598[/url]

呢一段係順序讀dynArr及dynArr2,應該得掛。

Susan﹏汪汪 2017-11-9 03:00 PM

[quote]原帖由 [i]ncream[/i] 於 2017-11-9 02:57 PM 發表 [url=http://www.discuss.com.hk/redirect.php?goto=findpost&pid=470619066&ptid=27047082][img]http://www.discuss.com.hk/images/common/back.gif[/img][/url]



http://rextester.com/WJX47598

呢一段係順序讀dynArr及dynArr2,應該得掛。 [/quote]
呢個得

ncream 2017-11-9 03:03 PM

[quote]原帖由 [i]Susan﹏汪汪[/i] 於 2017-11-9 03:00 PM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=470619162&ptid=27047082][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]

呢個得 [/quote]


[url]http://rextester.com/BFG6137[/url]
岩唔岩?

Susan﹏汪汪 2017-11-9 03:05 PM

[quote]原帖由 [i]ncream[/i] 於 2017-11-9 03:03 PM 發表 [url=http://www.discuss.com.hk/redirect.php?goto=findpost&pid=470619299&ptid=27047082][img]http://www.discuss.com.hk/images/common/back.gif[/img][/url]



http://rextester.com/BFG6137
岩唔岩? [/quote]
就咁睇冇問題

ncream 2017-11-9 03:09 PM

[quote]原帖由 [i]Susan﹏汪汪[/i] 於 2017-11-9 03:05 PM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=470619364&ptid=27047082][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]

就咁睇冇問題 [/quote]

快左好多,真係要請你食飯,學到野啊﹗!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

快左好多。

用array sort  2750ms


用pointer sort 2187ms


呢個係單thread,係 i7 行multi thread可能將煙師兄個中價GPU打敗。:smile_38::smile_38::smile_38::smile_38:



[attach]7545595[/attach]

[[i] 本帖最後由 ncream 於 2017-11-9 03:12 PM 編輯 [/i]]

Susan﹏汪汪 2017-11-9 03:12 PM

[quote]原帖由 [i]ncream[/i] 於 2017-11-9 03:09 PM 發表 [url=http://www.discuss.com.hk/redirect.php?goto=findpost&pid=470619523&ptid=27047082][img]http://www.discuss.com.hk/images/common/back.gif[/img][/url]


快左好多,真係要請你食飯,學到野啊﹗!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

快左好多。

[/quote]
#23個post你又edit左:smile_30:

ncream 2017-11-9 03:13 PM

[quote]原帖由 [i]Susan﹏汪汪[/i] 於 2017-11-9 03:12 PM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=470619658&ptid=27047082][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]

#23個post你又edit左:smile_30: [/quote]

:fst_012::fst_012::fst_012::fst_012:

SORRY! 成日搞錯。
頁: [1] 2
查看完整版本: 小試驗