我正在尝试在编译器中优化表达式评估.
算术表达式都是C风格的,它们可能包含变量.我希望尽可能地简化表达式.
例如,(3+100*A*B+100)*3+100可以简化为409+300*A*B.
它主要取决于分配法,联想法和交换法.
我遇到的主要困难是如何结合这些算术规律和传统的堆栈扫描评估算法.
任何人都可以在编译器构建的上下文中分享与此或类似问题相关的经验吗?
当我使用nvcc 5.0编译.cu文件时,编译器会给我以下信息.
/ usr/bin/ld:在搜索-lcudart时跳过不兼容的/usr/local/cuda-5.0/lib/libcudart.so
它似乎是警告或错误.我不知道是怎么回事.
有没有人知道这些信息的更多细节?
鉴于这样的代码段:
#include <iostream>
#include <iterator>
#include <fstream>
#include <string>
using namespace std;
int main(){
ifstream file("1.txt");
string str((istream_iterator<char>(file)),istream_iterator<char>());
file.close();
cout<<str<<endl;
}
Run Code Online (Sandbox Code Playgroud)
该代码使用istream_iterator从文件构造一个字符串.
请注意,字符串构造函数的第一个参数用一对括号括起来.如果省略括号,则会出错.在VC++ 2008中,会出现链接错误.在G ++中,代码输出错误.
我对括号感到很奇怪.有什么区别,为什么?
我是 OpenMP 初学者。我就遇到这样的问题。
我有一个M长度为 的掩码数组N,其元素为either 0 or 1。我希望提取所有i满足的索引M[i]=1并将它们存储到一个新数组中T。
OpenMP 可以加速这个问题吗?
我尝试过以下代码。但它的性能并不有效。
int count = 0;
#pragma omp parallel for
for(int i = 0; i < N; ++i) {
if(M[i] == hashtag) {
int pos = 0;
#pragma omp critical (c1)
pos = count++;
T[pos] = i;
}
Run Code Online (Sandbox Code Playgroud) 我想保存在一个函数画布的状态DRAW1() ,它在另一个功能恢复DRAW2() .所以我写了下面的代码.但它不起作用.
<canvas id="canvas" style="width:500px; height:500px;" height="500" width="500"></canvas>
ctx = document.querySelector('#canvas').getContext('2d');
function draw1(){
ctx.save();
ctx.fillRect(25,25,100,100);
}
function draw2(){
ctx.restore();
}
draw1();
draw2();
Run Code Online (Sandbox Code Playgroud)
我想原因是状态保存在调用堆栈中.因此,在函数返回后,还会清除保存状态.
还有其他方式来实现我的需求吗?
UPD:背景是我想实现一个简单的动画,其中大部分都是静态的.我希望使用setInterval()来执行绘图函数draw().在draw()中,首先恢复画布并绘制剩余的动态部分.