2019年9月30日 星期一

clang plugin undefined reference

as https://patchwork.freedesktop.org/patch/219763/ suggestes, reorder the library including sequence

diff --git a/src/gallium/targets/opencl/Makefile.am b/src/gallium/targets/opencl/Makefile.am
index de68a93ad5..f0e1de7797 100644
--- a/src/gallium/targets/opencl/Makefile.am
+++ b/src/gallium/targets/opencl/Makefile.am
@@ -23,11 +23,10 @@  lib@OPENCL_LIBNAME@_la_LIBADD = \
  $(LIBELF_LIBS) \
  $(DLOPEN_LIBS) \
  -lclangCodeGen \
- -lclangFrontendTool \
  -lclangFrontend \
+ -lclangFrontendTool \
  -lclangDriver \
  -lclangSerialization \
- -lclangCodeGen \
  -lclangParse \
  -lclangSema \
  -lclangAnalysis \


2019年5月23日 星期四

llvm opt no effect?

in clang 5.0, it added a function call O0-optnone, which make your modification to llvm ir in passes not effective

compile you code with -Xclang -disable-O0-optnone then it will be effective again

2019年3月20日 星期三

prime nummber (C)

prime nummber
給你一個n,輸出第n個質數
// Comment

#include <stdio.h>
#include <stdint.h>

#define n 10000

uint64_t primes[n];

int main(void){

  int primesSize = 2;
  primes[0] = 2;
  primes[1] = 3; // notice n must >= 2
  for(uint64_t j = 4; j < UINTMAX_MAX; ++j){
    if(primesSize >= n)
      break;
    for(int k = 0; k < primesSize; ++k){
      if(j % primes[k] == 0)
        break;
      else if(primes[k]*primes[k] > j){
        primes[primesSize] = j;
        primesSize++;
        break;
      }
    }
  }
  printf("%lu\n", primes[n-1]);


  return 0;
}
也可以使用6n+-1法 簡易版是在第一層for迴圈加入 if(j%2==0||j%3==0)continue;

even odd sort (C)

給你一個n,接下來有n個整數,對他們排序使得
(1) 偶數在奇數前面
(2) 偶數遞減排序、奇數遞增排序
然後輸出這個數列
// Comment
#include <stdio.h>
#include <stdlib.h>

int lessthan(const void * p, const void * q){
  return *(int*)p - *(int*)q;
}

int greaterthan(const void * p, const void * q){
  return *(int*)q - *(int*)p;
}

void eosort(int * arr, int arrSize){
  int *a1 = (int*)malloc(sizeof(int)*arrSize);
  int *a2 = (int*)malloc(sizeof(int)*arrSize);
  int odd_index = 0;
  int even_index = 0;
  int i;
  for(i = 0; i < arrSize; ++i){
    if(arr[i] % 2){
      a1[odd_index++] = arr[i];
    }
    else
      a2[even_index++] = arr[i];
  }
  qsort(a1, odd_index, sizeof(int), lessthan);
  qsort(a2, even_index, sizeof(int), greaterthan);

  for(i = 0; i < even_index; ++i){
    arr[i] = a2[i];
  }
  for(i = 0; i < odd_index; ++i){
    arr[i + even_index] = a1[i];
  }
}


int main(void){
  int arr[] = {0, 9, 2, 7, 4, 5, 6, 3, 8, 1, 10};
  int arrSize = 11;
  eosort(arr, arrSize);
  int i;
  for(i = 0; i < arrSize; ++i){
    printf("%d ", arr[i]);
  }
  putchar('\n');
  return 0;
}

1004. Max Consecutive Ones III (C)

// Comment
int longestOnes(int* A, int ASize, int K) {
    int result = 0;
    int localmax = 0;
    int indexOfZero = 0;
    for(int i = 0; i < ASize; ++i){
        if(A[i] == 0)
            K--;
        localmax++;
        while(K<0){
            if(A[indexOfZero] == 0){
                K++;
            }
            indexOfZero++;
            
            localmax--;
        }
        result = localmax > result ? localmax : result;
        
    }
    return result;
}

2019年2月11日 星期一

overload, override, polymorphism

Overload
一個func name可以take不同的input parameter
C比較難做到
https://stackoverflow.com/a/25026358


Override
C++11提供之修飾字only for existed virtual function
成功修改繼承來的virtual function的時候,加不加override的效果一樣
但修改繼承virtual function失敗時,沒有加override的話會產生一個新的virtual function,有加override會提示error

Polymorphism
class anime
  virtual void eat(food f)
class cat : anime
class dog : anime

anime *p1 = new cat()
anime *p2 = new dog()
p1->eat()
p2->eat()
不用知道p1 p2是何種類別,用父類別去指定即可

2019年1月29日 星期二

memory rank bank

一個bank是棋盤狀儲存空間由row, column代表兩維度
一個chip有多個bank
一個rank由多個chip組成64bit or 72bit(ECC) 在64bit系統上
一條ram可以有多個rank
https://www.techbang.com/posts/18381-from-the-channel-to-address-computer-main-memory-structures-to-understand