如果我运行:
List(1, 4, 3, 9).reduce {(a, b) => println(s"$a + $b"); a + b}
Run Code Online (Sandbox Code Playgroud)
结果是:
1 + 4
5 + 3
8 + 9
Run Code Online (Sandbox Code Playgroud)
但是,如果我使用reduceLeft而不是reduce,它还会打印:
1 + 4
5 + 3
8 + 9
Run Code Online (Sandbox Code Playgroud)
我认为reduce以这种方式减少值的序列:
(1+4) + (3+9)
(5) + (12)
(17)
Run Code Online (Sandbox Code Playgroud)
reduceLeft和之间的真正区别是什么reduce?
我有一个具有向量作为成员变量之一的类。在构造函数中,向量容量是保留的(类VecUser使用'Test'对象):
class Test {
public:
Test(uint32_t size) {
this->v.reserve(size);
std::cout << v.capacity() << std::endl; // this prints 'size'
}
vector<uint32_t>& getV() { return v; }
private:
vector<uint32_t> v;
};
class VecUser {
public:
VecUser() {}
private:
void func() {
Test* test = new Test(32); // This prints '32'
vector<uint32_t> v = test->getV();
std::cout << v.capacity() << std::endl; // This prints '0'
}
};
Run Code Online (Sandbox Code Playgroud)
我认为,cout在func()函数打印“32”,而不是“0”。
但是,运行它后,它显示0。
为什么保留向量显示其容量为0?
我有两项工作需要首先同时运行:
1)for可以并行化的循环
2)可以用一个线程完成的功能
现在,让我描述一下我想做什么。
如果存在8个可用线程,
job(1)和job(2)必须首先分别使用7个线程和1个线程同时运行。
在job(2)完成之后,应该将job(2)使用的线程分配给job(1),它是并行的for循环。
我正在使用omp_get_thread_num来计算每个区域中活动的线程数。我希望完成job(1)时线程数增加1 job(2)。
下面介绍了可能是错误或确定的解决方案:
omp_set_nested(1);
#pragma omp parallel
{
#pragma omp sections
{
#pragma omp section // job(2)
{ // 'printf' is not real job. It is just used for simplicity.
printf("i'm single: %d\n", omp_get_thread_num());
}
#pragma omp section // job(1)
{
#pragma omp parallel for schedule(dynamic, 32)
for (int i = 0 ; i < 10000000; ++i) {
// 'printf' is not real job. …Run Code Online (Sandbox Code Playgroud) 目前存在将两个向量与一个函数连接或合并的方法.
但是,似乎没有办法将一个函数连接或合并三个以上的向量.
例如,
vector<string> a = {"a", "b"};
vector<string> b = {"c", "d"};
vector<string> c = {"e", "f"};
vector<string> d = {"g", "h"};
// newVector has to include {"a", "b", "c", "d", "e", "f", "g", "h"}
vector<string> newVector = function(a, b, c, d);
Run Code Online (Sandbox Code Playgroud)
如果没有,似乎可以使用variadic模板实现.
但是,我无法想象它是如何通过可变参数模板实现的.
有什么解决方案吗?
假设我们有以下课程:
class Test {
public:
Test() {}
std::vector<int>& getIntList() {
return intList;
}
private:
std::vector<int> intList;
};
Run Code Online (Sandbox Code Playgroud)
同样,我们在main函数中有以下代码来声明类数组:
int main(void) {
Test* test[20];
for (int i = 0; i < 20; ++i) {
test[i] = new Test();
}
}
Run Code Online (Sandbox Code Playgroud)
在这些情况下,将实例化测试对象。
现在,如果我在每个类中的向量中随机添加多个项目,
在调整其内存大小的同时,可能会碰撞每个类中每个向量的内存地址范围。
在这种情况下,是否将整个“测试”对象复制到其他存储区中,并调整矢量的大小?或者,向量STL是仅在类引用向量时才复制到其他存储区并调整大小吗?
完全地,这样编码不是一个好主意吗?
我正在使用 cuda 进行实验。
我认为如果二级缓存命中率高,性能就会提高。
然而,从nvprof来看,尽管L2缓存命中率约为93%,但L2缓存利用率较低。
为什么会出现这种情况?有没有例子可以实现这一点?
我正在使用 pgf95(Fortran 编译器)编译源代码。
如果我使用 cuda 10.0,它会成功编译源代码。
但是,如果我使用 cuda 10.1,则无法显示“找不到 libcublasLt.so”。
当我扫描目录 cuda-10.0/lib64、cuda-10.1/lib64 时,两者都没有以“libcublasLt”开头的文件。
我该如何解决这个问题?