上一页 1 ··· 10 11 12 13 14 15 16 17 18 ··· 24 下一页

2014年4月9日

C/C++中printf/cout 计算顺序与缓冲区问题

摘要: 1.printf/cout在同一个语句中都是从右向左计算的。看如下的代码:1 #include 2 int main()3 {4 int i=0;5 printf("%d %d",i++,i++);6 printf(" %d",i++);7 return 0;8 }输出结果:1 02(第5行,先计算右边的i++,再计算左边的i++。所以输出时1 0)2.printf/cout 有行缓冲区直到缓冲区满,或者遇到换行符,或者程序结束,或者刷新缓存,才进行输出。C使用fflush(stdout)刷新缓冲区;C++中使用cout.flush()刷新缓冲区。看如下 阅读全文

posted @ 2014-04-09 10:47 旭东的博客 阅读(3661) 评论(3) 推荐(0) 编辑

2014年4月8日

文本处理中的小细节

摘要: 1.char还是uchar(unsigned char) char在C/C++中占用1byte(即8bits)。 ASCII码使用指定的7位或8位二进制数组合来表示128或256种可能的字符。标准ASCII码也叫基础ASCII码,使用7位二进制数来表示所有的大写和小写字母,数字0到9、标点符号,以及在美式英语中使用的特殊控制字符。标准ASCII码是7位二进制表示,表示128个字符(0~127),最高位是0。如 00110000(2) =48D=30H='0'。 由于char能表示的范围是(-128~127),英文中使用了0~127号编码的字符(符号位为0,正数)。一个汉字占2b 阅读全文

posted @ 2014-04-08 22:14 旭东的博客 阅读(763) 评论(0) 推荐(0) 编辑

2014年4月3日

GPGPU OpenCL 获取kernel函数编译信息

摘要: 使用OpenCL编程时,kernel写成一个单独的文件或者将文件内容保存在一个string中。可以使用clBuildProgram对kernel进行编译链接(compiles & links),如果失败,可以使用clGetProgramBuildInfo获取OpenCL编译器对kernel的编译信息。1.clBuildProgram cl_int clBuildProgram ( cl_program program, //program cl_uint num_devices, //the number of device const cl_device_id *d... 阅读全文

posted @ 2014-04-03 11:07 旭东的博客 阅读(3906) 评论(0) 推荐(0) 编辑

2014年3月30日

GPGPU OpenCL/CUDA 高性能编程的10大注意事项

摘要: 1.展开循环 如果提前知道了循环的次数,可以进行循环展开,这样省去了循环条件的比较次数。但是同时也不能使得kernel代码太大。 循环展开代码例子: 1 #include 2 using namespace std; 3 4 int main(){ 5 int sum=0; 6 for(int i=1;i2 int main()3 {4 int a=SIZE;5 printf("a=%d, SIZE=%d\n",a,SIZE);6 return 0;7 }View Code 编译: g++ -DSIZE=128 -o A Dmacro.cpp4... 阅读全文

posted @ 2014-03-30 21:24 旭东的博客 阅读(9880) 评论(1) 推荐(1) 编辑

2014年3月28日

GPGPU OpenCL 精确字符串查找

摘要: 字符串查找是信息安全、信息过滤领域的重要操作,尤其是对大文本的实时处理。这篇作为实例,使用GPU OpenCL进行精确模式串查找。1.加速方法 (1)将少量常量数据,如模式串长度、文本长度等,保存在线程的private memory中。 (2)将模式串保存在GPU的local memory中,加速线程对模式串的访问。 (3)将待查找的文本保存在global memory中,使用尽可能多线程访问global memory,减小线程平均访存时间。 (4)每个work-group中的线程操作文本中一段,多个work-group并行处理大文本。2.同步 (1)work-group内,使用CL... 阅读全文

posted @ 2014-03-28 14:57 旭东的博客 阅读(2397) 评论(0) 推荐(0) 编辑

2014年3月26日

OpenMP 中的线程任务调度

摘要: OpenMP中任务调度主要针对并行的for循环,当循环中每次迭代的计算量不相等时,如果简单地给各个线程分配相同次数的迭代,则可能会造成各个线程计算负载的不平衡,影响程序的整体性能。如下面的代码中,如果每个线程执行的任务数量平均分配,有的线程会结束早,有的线程结束晚: 1 #include 2 #include 3 4 int main(){ 5 int a[100][100] = {0}; 6 #pragma omp parallel for 7 for (int i =0; i 2 #include 3 int main(){ 4 int a[100][100] ... 阅读全文

posted @ 2014-03-26 16:16 旭东的博客 阅读(12541) 评论(1) 推荐(1) 编辑

2014年3月22日

设计模式之责任链模式

摘要: 设计模式是前人、大牛等在实际编程中对遇到的问题解决方案的抽象,也就是每一个设计模式都在编程实例中有体现。1.责任链模式在编程中的小体现,看下面的情况:(1)if else if .... 1 if(aB->D。(责任链末尾必须是默认处理类,也即switch中的default部分) 1 #include 2 using namespace std; 3 class Handler{ ///处理类抽象 4 public: 5 Handler(int _value):value(_value){} ///设置自身能够处理的编号 6 virtual ~Handler(){} 7 ... 阅读全文

posted @ 2014-03-22 21:07 旭东的博客 阅读(12478) 评论(1) 推荐(1) 编辑

2014年3月21日

OpenMP 线程同步之临界区

摘要: 多核/多线程编程中肯定会用到同步互斥操作。除了互斥变量以为,就是临界区。临界区是指在用一时刻只允许一个线程执行的一段用{...},包围的代码段。在OpenMP中临界区声明方法如下:#pragma omp critical [(name)] //[]表示名字可选{ //需要同一时刻只能有一个线程访问的代码}如下面的代码: 1 #include 2 #include 3 4 int main() 5 { 6 int sum = 0; 7 #pragma omp parallel 8 printf("Hello World!!!\n"); 9 10 #pragma omp pa. 阅读全文

posted @ 2014-03-21 17:52 旭东的博客 阅读(3830) 评论(0) 推荐(0) 编辑

2014年3月20日

设计模式之原型模式

摘要: 设计模式中的原型模型主要是针对构造复杂对象提出来的,当构造函数需要大量的操作时构造一个类的对象会耗费大量的资源。本文:http://www.cnblogs.com/xudong-bupt/p/3506450.html1.C++中的解决方案 在C++中默认提供了copy构造函数、copy assignment操作符,可以实现对象的内存拷贝,节省了新构造对象的开销,其中的实现机制就是操作符重载。C++代码如下: 1 #include 2 #include 3 using namespace std; 4 5 class Point{ 6 public: 7 Point(const ... 阅读全文

posted @ 2014-03-20 22:07 旭东的博客 阅读(1678) 评论(0) 推荐(0) 编辑

2014年3月19日

GPGPU OpenCL使用结构体数据

摘要: OpenCL编程中可以使用结构体,只需要在核函数kernel中提供同样的结构体申明就可以啦。如果在主函数中定义了结构体:1 typedef struct studentNode{2 int age;3 float height;4 }student;主函数中定义数据,并传输给OpenCL kernel: 1 student *stu_input=(student*)malloc(sizeof(studentNode)); 2 stu_input->age=25; 3 stu_input->height=1.8l; 4 student *stu_o... 阅读全文

posted @ 2014-03-19 15:44 旭东的博客 阅读(3612) 评论(0) 推荐(0) 编辑

上一页 1 ··· 10 11 12 13 14 15 16 17 18 ··· 24 下一页

导航