我的线程同步"风格"似乎正在抛出helgrind.这是一个简单的程序,可以重现问题:
#include <thread>
#include <atomic>
#include <iostream>
int main()
{
std::atomic<bool> isReady(false);
int i = 1;
std::thread t([&isReady, &i]()
{
i = 2;
isReady = true;
});
while (!isReady)
std::this_thread::yield();
i = 3;
t.join();
std::cout << i;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
据我所知,上面是一个完美的程序.但是,当我使用以下命令运行helgrind时,我收到错误:
valgrind --tool=helgrind ./a.out
Run Code Online (Sandbox Code Playgroud)
这个输出是:
==6247== Helgrind, a thread error detector
==6247== Copyright (C) 2007-2015, and GNU GPL'd, by OpenWorks LLP et al.
==6247== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==6247== Command: ./a.out
==6247==
==6247== ---Thread-Announcement------------------------------------------ …Run Code Online (Sandbox Code Playgroud) 在C++中我会用boost::clamp它.基本上我有一些excel功能
A1*B2+C3+D4
我想把它限制在+/-某个数字,称之为X1.显而易见的是:
MAX(-X1, MIN(X1, A1*B2+C3+D4))
但我希望能够做到这一点:
CLAMP(A1*B2+C3+D4, -X1, X1)
这个或类似的东西存在吗?我只是好奇 - 显然这个解决方法有效,它只是丑陋.
我已经设置了一个非常简单的多层感知器,其中一个隐藏层使用了sigmoid传递函数,模拟数据有两个输入.
我试图在Github上使用TensorFlow示例使用简单前馈神经网络进行设置.我不会在这里发布整个内容,但我的成本函数设置如下:
# Backward propagation
loss = tensorflow.losses.mean_squared_error(labels=y, predictions=yhat)
cost = tensorflow.reduce_mean(loss, name='cost')
updates = tensorflow.train.GradientDescentOptimizer(0.01).minimize(cost)
Run Code Online (Sandbox Code Playgroud)
然后我简单地循环了一堆时代,意图是我的权重通过updates每一步的操作进行优化:
with tensorflow.Session() as sess:
init = tensorflow.global_variables_initializer()
sess.run(init)
for epoch in range(10):
# Train with each example
for i in range(len(train_X)):
feed_dict = {X: train_X[i: i + 1], y: train_y[i: i + 1]}
res = sess.run([updates, loss], feed_dict)
print "epoch {}, step {}. w_1: {}, loss: {}".format(epoch, i, w_1.eval(), res[1])
train_result = sess.run(predict, feed_dict={X: train_X, y: train_y}) …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Windows 10(版本 1909)中的 WSL 控制台进行一些开发工作,但我发现经常运行的进程看起来只是挂起,但是当我向终端发送按键时,它会更新回bash 终端(好像一直完成但没有更新)。
我正在运行debian商店中最新版本的软件包。
有没有办法让这个问题消失,或者我是否在浪费时间尝试使用默认终端?
我只是问了一个关于相同主题的问题,但针对自定义模型(如何在 Keras 中找到自定义模型的衍生物?)但很快意识到这是在我可以走路之前尝试运行,因此该问题已被标记为重复这个的。
我试图简化我的场景,现在有一个(非自定义)keras模型由 2Dense层组成:
inputs = tf.keras.Input((cols,), name='input')
layer_1 = tf.keras.layers.Dense(
10,
name='layer_1',
input_dim=cols,
use_bias=True,
kernel_initializer=tf.constant_initializer(0.5),
bias_initializer=tf.constant_initializer(0.1))(inputs)
outputs = tf.keras.layers.Dense(
1,
name='alpha',
use_bias=True,
kernel_initializer=tf.constant_initializer(0.1),
bias_initializer=tf.constant_initializer(0))(layer_1)
model = tf.keras.Model(inputs=inputs, outputs=outputs)
prediction = model.predict(input_data)
# gradients = ...
Run Code Online (Sandbox Code Playgroud)
现在我想知道outputs关于inputsfor inputs=的导数input_data。
到目前为止我尝试过的:
This answer to a different question建议运行grads = K.gradients(model.output, model.input). 但是,如果我运行它,则会出现此错误;
启用急切执行时不支持 tf.gradients。使用 tf.GradientTape 代替。
我只能假设这与现在默认的急切执行有关。
另一种方法是回答我关于自定义 keras 模型的问题,其中包括添加以下内容:
with tf.GradientTape() as tape:
x = …Run Code Online (Sandbox Code Playgroud) 我已经下载了VS2012主题编辑器,但现在想为它找到更多主题.具体来说,我是.vstheme文件,但一直无法找到.我希望得到一个与主题编辑器一起使用的漂亮黑暗主题.我对VS2010中使用的设置文件不感兴趣.如果相关,我用C++编写.
"天真"的解决方案是;
std::vector<T> vector_of_objects;
vector_of_objects.reserve(vector_of_pointers.size());
for (T const * p : vector_of_pointers)
vector_of_objects.push_back(*p);
Run Code Online (Sandbox Code Playgroud)
上述内容似乎很麻烦,也许并不是很明显.
是否有一种解决方案至少效率不高,可能更快更直观?我在想C++ 11可能有一个我不知道的解决方案......
请注意,这个问题是关于C++ 只是,我不想使用现有的数据库库,我也没有寻求一个通用的解决方案,以"数据库在C++".我有一个特定的问题,并且遵循以下问题的最有效(在时间,空间和最佳实践方面)解决方案.
假设我有一个系列的书,通过描述Id,ISBN,Author,和Name.该Name柱将其涉及作者的一个单独的表,包含的列的ID Id,Surname,First Name.我希望能够通过名称和作者进行有效搜索.我将如何构建这个,以及我将使用哪些容器?
在SO和其他地方已经多次讨论过这个主题,但是从来没有专门针对C++或不使用现有库的实现的答案.
天真的解决方案只是创建两个单独的类:Author和Book:
class Book
{
public:
int id;
std::string isbn;
Author* author;
std::string name;
};
class Author
{
public:
int id;
std::string surname;
std::string givenName;
};
Run Code Online (Sandbox Code Playgroud)
然后我可以创建Book和Author(指针)的向量.但是我如何有效地索引这些?假设我想通过它的ISBN找到一本书; 我怎样才能在恒定或至少对数时间内做到这一点?这可能吗?这种问题有标准做法吗?
我想获得一个std::valarray范围,该范围引用另一个valarray对象的值范围,而不制作值的副本。文档有关的指标规定[]操作,我需要使用std::slice std::gslice或布尔std::valarray对象作为参数来实现这一点,在这种情况下,我会得到一个slice_array,gslice_array或mask_array为回报:
slice_array<T> operator[] (slice slc);
gslice_array<T> operator[] (const gslice& gslc);
mask_array<T> operator[] (const valarray<bool>& msk);
indirect_array<T> operator[] (const valarray<size_t>& ind);
Run Code Online (Sandbox Code Playgroud)
当我查看这些返回类型的描述时,它们都是一样的!查看以下描述:slice_array,gslice_array,mask_array,indirect_array。
那么我应该在哪种情况下使用呢?我理解这一点,mask_array并且indirect_array似乎更倾向于专门从某个范围中选择值,但是slice_array/ gslice_array呢?
就我而言,我正在考虑使用slice_array它,因为这听起来很像我在做什么(我正在切片,对吧?)。但我更喜欢一些具体的东西!
我有这段代码作为分析,优化和缓存效率,因为我很可能通过我的知识水平得到它.它在概念上在CPU上运行如下:
#pragma omp parallel for schedule(dynamic)
for (int i = 0; i < numberOfTasks; ++i)
{
result[i] = RunTask(i); // result is some array where I store the result of RunTask.
}
Run Code Online (Sandbox Code Playgroud)
它只是恰巧,RunTask()本质上是一组在每一次一样,非常大的数据集反复操作线性代数运算的,所以它适合在GPU上运行.所以我想实现以下目标:
RunTask()功能,而不必修改它以符合restrict(amp).我当然可以restrict(amp)为GPU任务设计一个兼容的lambda.最初我想过做以下事情:
// assume we know exactly how much time the GPU/CPU needs per task, and this is the
// most time-efficient combination:
int numberOfTasks = 1000;
int ampTasks = 800;
// RunTasksAMP(start,end) sends a restrict(amp) kernel …Run Code Online (Sandbox Code Playgroud)