小编Xha*_*lie的帖子

nVidia Thrust:device_ptr Const-Correctness

在我广泛使用nVidia CUDA的项目中,我有时会将Thrust用于非常非常好的事情.Reduce是一种在该库中特别好实现的算法,reduce的一个用途是通过将每个元素除以所有元素的总和来规范化非负元素的向量.

template <typename T>
void normalise(T const* const d_input, const unsigned int size, T* d_output)
{
    const thrust::device_ptr<T> X = thrust::device_pointer_cast(const_cast<T*>(d_input));
    T sum = thrust::reduce(X, X + size);

    thrust::constant_iterator<T> denominator(sum);
    thrust::device_ptr<T> Y = thrust::device_pointer_cast(d_output);
    thrust::transform(X, X + size, denominator, Y, thrust::divides<T>());
}
Run Code Online (Sandbox Code Playgroud)

(T通常是floatdouble)

一般来说,我不希望在整个代码库中依赖Thrust,因此我尝试确保上述示例之类的函数只接受原始CUDA设备指针.这意味着一旦它们由NVCC编译,我可以静态地将它们链接到没有NVCC的其他代码中.

但是,这段代码让我很担心.我希望函数是const-correct但我似乎无法找到一个const版本thrust::device_pointer_cast(...)- 这样的东西是否存在?在这个版本的代码中,我使用了一个,const_cast所以我const在函数签名中使用,这让我很难过.

另外,将reduce的结果复制到主机只是为了将其发送回设备以进行下一步,感觉很奇怪.有一个更好的方法吗?

c++ cuda thrust

4
推荐指数
1
解决办法
580
查看次数

为什么 Chrome 在反复刷新使用 WebAssembly 的页面后最终会抛出“内存不足:wasm 内存”?

我想相信刷新浏览器窗口或选项卡不会泄漏。不幸的是,就 WebAssembly 而言,情况似乎并非如此。

我用 Rust 构建了一个 WebAssembly 板条箱。crate 的编译大小约为 360 Kb(在内容压缩之前),并且 crate 在 Firefox 甚至 iOS 上的 Safari 中都可以正常工作。但是,我在 Chrome 中遇到了很多问题,其中之一是刷新使用.wasm最终导致控制台内存不足错误的页面。

该页面在大约 35 次刷新后正常工作,然后抛出以下内容:

Uncaught (in promise) RangeError: WebAssembly Instantiation: Out of memory: wasm memory
Run Code Online (Sandbox Code Playgroud)

在此之后,该选项卡没有用,但打开一个新选项卡并加载页面按预期工作——同样,大约前 35 次刷新。

这是浏览器中的错误还是我在代码中做错了什么?如果它是一个错误,有什么办法可以解决它吗?(并不是说我希望它会在生产中表现出来,但无论如何......)

(据推测,错误消息中提到的承诺是 返回的import('...')那个。我正在使用 webpack,所以我受到了https://github.com/webpack/webpack/issues/6615 的影响)

google-chrome webpack webassembly

4
推荐指数
1
解决办法
2438
查看次数

构造和销毁失败之间的C++代码重用

我有一个包装一些非托管资源的类.它们在构造函数中分配,并根据RAII模式在析构函数中释放.但是,分配不是原子的,并且,如果构造函数的后期失败,则必须在向调用者抛出异常之前释放在早期阶段分配的所有资源.

越来越多的这种边缘情况代码开始类似于析构函数本身.

我知道C++类能够调用自己的析构函数,并且因为析构函数被实现为处理通过移动操作留在僵尸状态的实例,所以析构函数在尝试释放之前已经检查资源是否实际已分配他们.那么,如果一个类在构造失败的情况下调用它的析构函数,它是否可以接受?

另一种方法是创建一个名为命名的方法release()uninitialise()或类似的东西,并呼吁在事件方法构造失败和析构函数的主体.

哪个是更好的模式?

c++

0
推荐指数
1
解决办法
72
查看次数

Vue `v-for` 指令的整数范围绑定到组件属性?

我正在试验Vue.js(版本 2.5.16)及其指令,根据官方 Vue.js 文档v-for,该指令应该能够根据某个整数范围重复元素。具体来说,我正在尝试编写一个组件,该组件根据整数值属性绘制多个循环计数器。

下面的代码片段包含硬编码的文字值10,确实精确地渲染了十个圆圈:( jsfiddle )

    <svg class="counter" v-for="n in 10" :key="n"
         xmlns="http://www.w3.org/2000/svg" version="1.1"
         xmlns:xlink="http://www.w3.org/1999/xlink"
         viewBox="0 0 10 10">
        <circle cx="5" cy="5" r="5"></circle>
    </svg>
Run Code Online (Sandbox Code Playgroud)

然而,对值进行硬编码的作用有限。我已向我的组件添加了一个整数值属性,如下所示:(typescript

export default Vue.extend({
    props: {
        counter: Number
    },
    ...
Run Code Online (Sandbox Code Playgroud)

...并尝试了该指令的以下变体v-for

  • v-for="n in counter" :key="n"jsfiddle
  • v-for="n in {counter}" :key="n"jsfiddle

但它们都没有实现可变数量的渲染圆。(注意:我使用了 Vue 开发人员工具来确保counter组件的属性实际上具有正确的值。

这让我想到了我的问题:如何使用v-for组件属性设置的整数范围?

如果这是不可能的,那么 的整数范围支持v-for确实毫无用处。人们多久需要使用一次硬编码范围?

但是,我仍然想要这种行为。如果没有 ,人们将如何实现它v-for?我可以想到几种可能的替代方案: …

vue.js vuejs2 v-for

0
推荐指数
1
解决办法
3723
查看次数

标签 统计

c++ ×2

cuda ×1

google-chrome ×1

thrust ×1

v-for ×1

vue.js ×1

vuejs2 ×1

webassembly ×1

webpack ×1