候选benchmark PloyBench cell_cuda radinia FDTD
- Himeno stencil:test
1 2 3 4 5 6 7 8 9 |
|
- 3D Possion 19-point: test
1 2 3 4 5 |
|
- 3D heat:test
1 2 3 4 |
|
- Wave equation:test
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
1 2 3 4 5 6 7 8 9 |
|
1 2 3 4 5 |
|
1 2 3 4 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
之前的代码中把训练的模型存储到文件中,之后调用的时候会通过函数load加载。这次把load的调用包装到一个函数内,结果怎么都load不进来(当前函数内有效,切换到其他函数时加载的全局变量global.model就为空了)。经过研究,发现load把文件内的变量加载到当前函数environment的局部变量里了。
在调用load之后,把函数内局部变量的值用<<-
赋给全局变量。
1 2 |
|
对于R语言来说,要include另一个文件,需要用到命令source;对于在源文件中的R脚本,要source当前文件所在目录下的其他文件,还需要把R语言解释器的工作路径设置为当前文件所在路径,否则source某个文件就需要使用绝对路径,不利于项目的移植。
通过下方的一块代码片段,就可以把R语言的工作路径设置为文件所在路径
1 2 3 4 |
|
shared-memoy在硬件层是以SM为单位,在逻辑层是以block为单位
warp是GPU在硬件层的并行单位。一般来说,warp等于32. SM在处理一个block kernel时,会经可能多的发射warp,每个warp内线程的大小为32.
每个SM可以同时驻留多个 block执行(active block),这主要取决于当前SM是否拥有足够的硬件资源,如Register,shared-memory等等.1
在200机器上的GPU,每个SM拥有256*256个32位的寄存器(即平均每个线程有256个32-bite的寄存器),49152byte的shared memory,65536byte的constant memory。
把部分无共享的shared-memory变为global memory, 并没有增加速度,推测是因为对shared-memory减少的还不够 不足以使得同时在SM运行的block增加。(已经验证)
有些常量经常被用到,且占用的空间很小。之前使用常量存储器,现改用参数传递,放入寄存器进行加速。
把与threadIdx无关的公共计算提到host端计算,再把结果使用参数传递给kernel函数
写回的变量不使用shared-memory
shared-memory和分块大小之间有一个tradeoff,即越多的shared-memory会导致在同一SM上驻留的block减少,但同时其访存的性能会上升
除法非常耗时,如果精度允许的话,使用被除数的倒数组成乘法替换除法。
GPU适合小而多的运算,对于复杂运算(例如许多除法,大尺寸工作集),CPU反而占据性能优势
Performance optimization revolves around three basic strategies: Maximize parallel execution to achieve maximum utilization; Optimize memory usage to achieve maximum memory throughput;* Optimize instruction usage to achieve maximum instruction throughput
XXXX###Application Level XXXX###Device Level 1. For devices of compute capability 1.x, only one kernel can execute on a device at one time, so the kernel should be launched with at least as many thread blocks as there are multiprocessors in the device.2. For devices of compute capability 2.x and higher, multiple kernels can execute concurrently on a device, so maximum utilization can also be achieved by using streams to enable enough kernels to execute concurrently as described in Asynchronous Concurrent Execution.
XXXX
XXXX
XXXX
详见http://stackoverflow.com/questions/12212003/how-concurrent-blocks-can-run-a-single-gpu-streaming-multiprocessor/12213137#12213137↩
测试CUDA应用的时间
引用自stackoverflow:
You could do sth along the lines of :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
or:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
其中,在cpu端计时,由于GPU的kenernl与cpu是异步执行,所以在获得整个cuda应用的结束时间前,必须要调用cudaThreadSynchronize(现替换成cudaDeviceSynchronize),否则测的时间是最后一个kernel 启动的时间。
今天,在使用ROSE自动生成CUDA代码时,遇到一个问题:程序中需要使用纹理存储器对GPU访存进行加速,相应地要生成texture变量声明的代码。由于texture初始化时使用到一个宏,该宏定义在文件头部,这就使得texture的初始化必须在宏定义之后。翻遍了手册,找不到把语句插入preprocessinfo 结点(include,#define )之后的方法,于是退一步打算找到当前scope中第一个语句,然后插到该语句之后。本打算调用firststatement的方法,报错,并且scope中的statement并不全是源码中的语句,会包含一些头文件中的结点。
通过比较scope和scope中语句的名字,找到当前源文件中第一个SgStatement
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
测试ODBC安装是否成功
使用isql测试数据源是否配置正确
1 2 3 |
|
如果数据源配置正确,会出现进入数据库