小编any*_*ker的帖子

C++17:如何控制执行策略中的线程数?

C++17 标准引入了一个执行策略参数(例如std::execution::par_unseq),可以将其传递给库中的某些函数std以使它们并行执行,例如:

\n\n
std::copy(std::execution::par_unseq, obj1.begin(), obj1.end(), obj2.begin())\n
Run Code Online (Sandbox Code Playgroud)\n\n

在 OpenMP 等其他框架中,可以设置它将使用的最大线程数,例如#pragma omp parallel num_threads(<desired_numer>)在部分内本地设置,或omp_set_num_threads(<desired_number>)在调用范围内设置。

\n\n

我\xe2\x80\x99m 想知道如何在标准 C++ 中实现执行策略。

\n

c++ c++17

9
推荐指数
1
解决办法
1294
查看次数

如何使 cython 成为 pip 安装的要求?

当创建Python包并将其上传到 时,它会自动安装下面文件pypi中的要求,例如setup.pyinstall_requires

\n\n
from distutils.core import setup\nsetup(\n  name = 'a_package',\n  packages = ['a_package'],\n  install_requires=['another_package']\n)\n
Run Code Online (Sandbox Code Playgroud)\n\n

当包具有 cython 扩展名(并且.pyx是文件而不是.c/.cpp文件)时,该setup.py文件将需要导入 cython 来创建可安装的扩展名,例如

\n\n
from distutils.core import setup\nfrom distutils.extension import Extension\nfrom Cython.Distutils import build_ext\nsetup(\n  name = 'a_package',\n  packages = ['a_package'],\n  install_requires=['another_package'],\n  cmdclass = {'build_ext': build_ext},\n  ext_modules = [Extension('the_extension', sources=['a_file.pyx'])]\n)\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是由于 Cython 是在执行该部分之前导入的,因此当尝试从 从 下载的源(而不是从轮子)setup安装此包时 ,它将由于无法导入而安装失败,因为它尚未到达带有 的部分还没有达到要求。pippypicython

\n\n

我\xe2\x80\x99m想知道如何才能确保在尝试导入pip此软件包之前pypi安装该软件包。cython添加requirements.txt …

pip pypi

6
推荐指数
1
解决办法
2962
查看次数

CRAN可接受的将Rcpp调用的某些C代码链接到OpenMP的方式

我正在构建一个R包,其中包含一些.c带有使用OpenMP的代码的文件,并且这些C函数是从.cpp文件中调用的,但是.cpp文件本身并未使用OpenMP。

例如 cfile.c

int parallel_function(double *x, int n)
{   
    int i;
    #pragma omp parallel for firstprivate(x, n)
    for (i = 0; i < n; i++){ x[i] *= 2; }
}
Run Code Online (Sandbox Code Playgroud)

cppfile.cpp

#include <Rcpp.h>
using namespace Rcpp;
extern “C” {
    int parallel_function(double *x, int n);
}
// [[Rcpp::export]]
void multiply_by_two(NumericVector x, int n){parallel_function(x.begin(), n);}
Run Code Online (Sandbox Code Playgroud)

为了对C文件启用OpenMP,我的第一步虽然是Makevars按照R扩展手册来构造一个这样的文件:

PKG_CFLAGS = $(SHLIB_OPENMP_CFLAGS)
PKG_LIBS = $(SHLIB_OPENMP_CFLAGS)
Run Code Online (Sandbox Code Playgroud)

但这会给我以下几点:

Check: use of SHLIB_OPENMP_*FLAGS in Makefiles, Result: NOTE
    src/Makevars: …
Run Code Online (Sandbox Code Playgroud)

r openmp rcpp

5
推荐指数
1
解决办法
234
查看次数

R: how to serialize C/C++ data that lives in the heap?

Suppose I want to wrap some C or C++ code which contains arrays or vectors that cannot be automatically mapped to R types by Rcpp, but which I need to pass to C/C++ functions that would output valid R objects. For example:

typedef union {
    size_t val_sizet;
    long double val_longdbl;
    } weird_struct
std::vector<weird_struct> an_unmappable_obj;
an_unmappable_obj.resize(2);
an_unmappable_obj[0].val_sizet = 1e20;
an_unmappable_obj[1].val_longdbl = 1.5 * 1e20;
Run Code Online (Sandbox Code Playgroud)

Since this is a vector of a type that cannot be converted to any of R’s native …

r rcpp

3
推荐指数
2
解决办法
97
查看次数

具有权重的C ++随机非重复整数

我想高效地生成一个随机的,(封闭的)范围内唯一(非重复)整数的样本,[0, rnd_max]该范围内的每个数字都可以选择,并且每个样本均与样本权重相关(权重越大,越可能应该是选择了这个数字,weight[i] / sum(weight[not_taken])如果样本中还没有被选择的话,那么接下来就应该精确选择该数字)。

我看到C ++ std::discrete_distribution可以生成随机加权整数,但是如果我使用C ++ 生成随机加权整数并丢弃重复的整数,则当所取样本相对于可能范围的长度而言较大时,将会有很多失败的样本已经被采用,导致程序效率极低。我不清楚弗洛伊德(Floyd)的算法是否对样本权重的情况进行了扩展(https://math.stackexchange.com/questions/178690/whats-the-proof-of-correctness-for-robert-floyds-algorithm-选择一个罪)-我个人无法想到一个。

例如,也可以使用std::discrete_distribution将权重降低到零,或执行部分加权随机播放,例如此答案:C ++。加权的std :: shuffle-但在该答案中,std::discrete_distribution每次迭代都会重新生成,因此运行时间变为二次方(它需要循环遍历每次传递给它的权重)。

想知道对于C ++中唯一整数而言,什么是有效的加权随机样本,它对于变化的样本大小(例如,在可用范围内从1%到90%的样本数量)会很好地起作用。

#include <vector>
#include <random>
#include <algorithm>

int main()
{
    size_t rnd_max = 1e5;
    size_t ntake = 1e3;

    unsigned int seed = 12345;
    std::mt19937 rng(seed);
    std::gamma_distribution<double> rgamma(1.0, 1.0);
    std::vector<double> weights(rnd_max);
    for (double &w : weights) w = rgamma(rng);

    std::vector<int> chosen_sample(ntake);
    // sampler goes here...

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ random

3
推荐指数
1
解决办法
164
查看次数

C++:std::runtime_error 对象会在 longjmp 中泄漏吗?

假设我有一些 C++ 代码,其中有一个 try-catch 块,其中该catch部分将触发长跳转:

#include <stdexcept>
#include <stdio.h>
#include <setjmp.h>

void my_fun()
{
    jmp_buf jump_buffer;
    if (setjmp(jump_buffer))
        return;
    
    try {
        std::string message;
        message.resize(100);
        snprintf(&message[0], 100, "error code %d\n", 3);
        throw std::runtime_error(message);
    }

    catch (std::runtime_error &e) {
        longjmp(jump_buffer, 1);
    }
}
Run Code Online (Sandbox Code Playgroud)

由于该std::runtime_error对象是在某处动态分配的,因此它是否会泄漏为其或字符串分配的内存?

c++ exception setjmp

3
推荐指数
1
解决办法
162
查看次数

标签 统计

c++ ×3

r ×2

rcpp ×2

c++17 ×1

exception ×1

openmp ×1

pip ×1

pypi ×1

random ×1

setjmp ×1