- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 C++ 编程的新手,正在尝试通过 R 试验 Rcpp。我创建了一个函数来从一个字符串中生成所有可能的 k-mers。它以它的串行形式运行良好:
#include <Rcpp.h>
#include <string>
#include <iostream>
#include <ctime>
// using namespace Rcpp;
// [[Rcpp::export]]
std::vector< std::string > cpp_kmer( std::string s, int k ){
std::vector< std::string > kmers;
int seq_loop_size = s.length() - k+1;
for ( int z=0; z < seq_loop_size; z++ ) {
std::string kmer;
kmer = s.substr( z, k );
kmers.push_back( kmer ) ;
}
return kmers;
}
但是,当我尝试在并行实现(使用 RcppParallel)中使用此函数时,代码如下:
#include <Rcpp.h>
#include <string>
#include <iostream>
#include <ctime>
using namespace Rcpp;
// [[Rcpp::depends(RcppParallel)]]
#include <RcppParallel.h>
using namespace RcppParallel;
struct p_cpp_kmer : public Worker {
// input string
std::vector< std::string > seqs;
int k;
std::vector< std::string > cpp_kmer( std::string s, int k );
// destination list
List output;
std::string
sub_s;
// initialize with source and destination
p_cpp_kmer(std::vector< std::string > seqs, int k, List output)
: seqs(seqs), k(k), output(output) {}
// calculate k-mers for the range of sequences requested
void operator()(std::size_t begin, std::size_t end) {
for (std::size_t i = begin; i < end; i++)
sub_s = seqs[i];
cpp_kmer(sub_s, k);
}
};
// [[Rcpp::export]]
List par_cpp_kmer(std::vector< std::string > seqs, int k, bool v){
// allocate output list
List outpar(num_seqs);
int num_seqs = seqs.size();
// p_cpp_kmer functor (pass input and output matrixes)
p_cpp_kmer par_kmer(seqs, k, outpar);
parallelFor(0, num_seqs, par_kmer);
return wrap(outpar);
}
std::vector< std::string > cpp_kmer( std::string s, int k ){
std::vector< std::string > kmers;
int seq_loop_size = s.length() - k+1;
for ( int z=0; z < seq_loop_size; z++ ) {
std::string kmer;
kmer = s.substr( z, k );
kmers.push_back( kmer ) ;
}
return kmers;
}
编译失败,给出一个:undefined reference to p_cpp_kmer::cpp_kmer(std::string, int)'错误。
我知道它与声明/引用 cpp_kmer 有关,但我不知道在哪里/如何适本地这样做(由于我缺乏 C++ 知识)。
非常感谢您。
最佳答案
发生的情况是您的 p_cpp_kmer
结构声明了一个 cpp_kmer
方法,但它从未被定义。相反,稍后定义的是自由函数 cpp_kmer
。
你声明这个方法
std::vector< std::string > cpp_kmer( std::string s, int k );
你似乎想使用它:
void operator()(std::size_t begin, std::size_t end) {
for (std::size_t i = begin; i < end; i++)
sub_s = seqs[i];
cpp_kmer(sub_s, k);
}
但是您在这里定义了自由函数 cpp_kmer
:
std::vector< std::string > cpp_kmer( std::string s, int k ){
std::vector< std::string > kmers;
int seq_loop_size = s.length() - k+1;
for ( int z=0; z < seq_loop_size; z++ ) {
std::string kmer;
kmer = s.substr( z, k );
kmers.push_back( kmer ) ;
}
return kmers;
}
您可以删除结构中 cpp_kmer
方法的定义以便使用自由函数,或者实际定义它。
代码还有其他问题:
在您的 operator()
中,您丢弃了结果。我猜你的意思是用这个代替 output[i] = cpp_kmer(sub_s, k);
即使您执行上述代码也是不安全的,因为 output[i] = cpp_kmer(sub_s, k);
分配 R 对象(每个单独的 R 字符串和字符串vector) ,这不能在单独的线程中发生。
如果您真的想并行执行此操作,则需要确保不在工作线程中分配任何 R 对象。
此外,当您考虑使用 C++11 和底层 RcppParallel
的 tbb 库时,编写并行代码会容易得多。例如:
#include <Rcpp.h>
#include <RcppParallel.h>
using namespace Rcpp;
using namespace RcppParallel;
// [[Rcpp::depends(RcppParallel)]]
// [[Rcpp::plugins(cpp11)]]
using string_vector = std::vector< std::string > ;
using list_string_vector = std::vector<string_vector> ;
// [[Rcpp::export]]
list_string_vector par_cpp_kmer( string_vector seqs, int k, bool v){
int num_seqs = seqs.size() ;
list_string_vector out(num_seqs) ;
tbb::parallel_for( 0, num_seqs, 1, [&seqs,k,&out](int i){
std::string& s = seqs[i] ;
int seq_loop_size = s.length() - k+1;
std::vector<std::string> vec(seq_loop_size) ;
for ( int z=0; z < seq_loop_size; z++ ) {
vec[z] = s.substr( z, k );
}
out[i] = vec ;
}) ;
return out ;
}
这是假设 std::string
可以在单独的线程中分配:
> par_cpp_kmer( c("foobar", "blabla"), 3 )
[[1]]
[1] "foo" "oob" "oba" "bar"
[[2]]
[1] "bla" "lab" "abl" "bla"
关于c++ - 对工作程序中自定义函数的 undefined reference (C++ 和 RcppParallel),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43511683/
我想编写代码使用 RcppParallel 计算 v^T Av。这里 v 是一个大小为 n 的 vector ,A 是一个 n×n 矩阵。我的想法是以并行方式评估 Av,然后计算该 vector 与
我写了下面的代码来训练自己使用 RcppParallel。这只是一个玩具示例。 // [[Rcpp::depends(RcppParallel)]] #include #include #incl
灵感来自文章 http://gallery.rcpp.org/articles/parallel-distance-matrix/ ,我尝试使用 RcppParallel 在高维参数空间中运行强力搜索
我正在尝试使用 RcppParallel 并行添加(大)向量。这就是我想出的办法。 // [[Rcpp::depends(RcppParallel)]] #include #include #in
我有一个矩阵,我想为它计算第 i 行和每隔一行(即我想要 i成对距离矩阵的第 th 行)。 #include #include #include #include //#include #i
以下玩具示例为 parallelFor工作正常( f2 是 f1 的并行版本): // [[Rcpp::depends(RcppParallel)]] // [[Rcpp::depends(RcppA
我正在学习在我的工作中使用 RcppParallel,并试图安装一个使用 Rcpp.package.skeleton() 制作的简单包。该软件包包含三个源文件,即 Rcpp 的 HelloWorld
我需要与 RcppParallel::RMatrix 合作.以前我曾与 Rcpp只要。但现在为 RcppParallel我需要一份文件,例如 Rcpp拥有。 例如 我 Rcpp::NumericMat
我是 C++ 编程的新手,正在尝试通过 R 试验 Rcpp。我创建了一个函数来从一个字符串中生成所有可能的 k-mers。它以它的串行形式运行良好: #include #include #incl
我有一个任务需要处理一个大型矩阵(数百万行,数百列)字符串。每行操作都是独立的。因此,我想利用一些并行计算来提高整个项目的速度。 如果我为数值矩阵构建myWorker,如下所示,我能够编译代码而不会出
我正在使用此 Rcpp 代码执行 quickselect在值向量上,即在 O(n) 时间内从向量中获取第 k 个最大元素(我将其保存为 qselect.cpp): // [[Rcpp::depends
概览:我对并行化(跨链)Gibbs 采样器感兴趣,以解决我遇到的非平凡回归问题 already implemented通过 Rcpp/RcppEigen 串行。我已阅读 RcppParallel 的文
我想在 RcppPralel worker 中使用线程安全函数指针。但是我已经对这个小例子产生了疑问。无论我是在包中使用它并在 DESCRIPTION 文件中添加 SystemRequirements
我是一名优秀的程序员,十分优秀!