小编wee*_*not的帖子

将一维“扁平化”索引转换为 N 维数组的 N 维向量索引

我有一个 N 维数组,每个维度具有相同数量的项目(即相同的“长度”)。

给定数组中的一维索引,我想要一个函数来返回与该索引关联的坐标。数组的索引方式实际上并不重要(从某种意义上说,数组的所有维度都是相等的,就将在数组上运行的算法而言,没有任何维度具有优先权)。

因此,例如,如果我有一个 4x4x4 数组,索引 63 应返回 [3,3,3],索引 0 应返回 [0,0,0],索引 5 应返回 [1,1,0]。

我编写了以下函数,其中 nDim 是维度数,nBin 是每个维度的长度:

def indicesOf(x,nDim,nBin) :
    indices = []
    for i in arange(0,nDim) :   
        index = (x/nBin**(i))%nBin
        indices.append(index)
        x -= index*nBin**i
    return indices
Run Code Online (Sandbox Code Playgroud)

它似乎有效——但是有没有更有效的方法来进行这个计算?老实说,我有一半“问”了这个问题只是为了分享这个解决方案,因为我在网上找不到解决方案。但如果有更有效的方法来做到这一点,那就太好了——请分享!

上面的函数是用 python 编写的,但我刚刚用它来对 C(实际上是 CUDA)函数进行原型设计,所以没有一个 python 很棒的库可供我使用。

这是结合 JackOLantern 和 Eric 关于以下两种尺寸的力量的评论的解决方案。它似乎适用于我尝试过的少数测试用例。

def indicesPowOf2(x,nDim,nBin) :
    logWidth = math.log(nBin,2)         
    indices = [0]*nDim
    for i in arange(nDim) :
        indices[i] = x & (nBin-1)
        x = x >> int(logWidth)
    return indices
Run Code Online (Sandbox Code Playgroud)

c c++ arrays indexing cuda

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

如何使用push min_element算法,在设备和主机之间没有memcpys

我正在优化pycuda /推力计划.在其中,我使用thrust :: min_element来识别设备上的数组中的最小元素的索引.

使用Nvidia的可视化分析器,似乎每当我打电话时thrust::min_element,都有一个DtoH(设备到主机)memcpy.我想要的只是在设备上进行的一切.换句话说,min_element()的输出应存储在设备上,我可以在以后使用它,而不会花费小DtoH memcpy的成本.有没有办法做到这一点?还是我错误地思考问题?

我的尝试是在下面,其中的想法是将指向的数组中最小元素的索引input_ptr放入指向的数组的第一个元素中output_ptr.一切都应该在设备上完成,主机上没有任何东西.

此代码生成正确的答案,但涉及不需要的memcpys.非常感谢您提供的任何帮助.

#include <thrust/extrema.h>
#include <thrust/device_vector.h>
#include <cuda.h>

void my_min_element(CUdeviceptr input_ptr, int length, CUdeviceptr output_ptr)
{
  thrust::device_ptr<float> i_ptr((float*)input_ptr);
  thrust::device_ptr<int> o_ptr((int*)output_ptr);
  o_ptr[0] = thrust::distance(i_ptr,thrust::min_element(i_ptr, i_ptr+length));
}
Run Code Online (Sandbox Code Playgroud)

cuda thrust

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

如何将向量传递给基于推力的odeint观察器的构造函数,以便可以在仿函数中读取它

我正在使用boost的使用push的odeint扩展参数研究示例,我不知道如何将值向量传递给观察者的构造函数,以便可以从观察者的函子中访问这些值(只读) .

以下是仅供观察者使用的代码.

//// Observes the system, comparing the current state to 
//// values in unchangingVector

struct minimum_perturbation_observer { 
  struct minPerturbFunctor
  {
    template< class T >
    __host__ __device__
    void operator()( T t ) const
    {
    //// I would like to be able to read any member 
    //// of m_unchangingVector here.
    }
  };


  // CONSTRUCTOR
  minimum_perturbation_observer( size_t N, state_type unchangingVector, int len) : 
        m_N( N ),
        m_output( N ),
        m_unchangingVector( len ) // len is the correct length of unchangingVector
  { …
Run Code Online (Sandbox Code Playgroud)

c++ boost thrust odeint

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

如何在重叠时颜色变得更强的地方绘制透明线条?

当你像这样在matplotlib中绘制一堆透明线条时,你会得到一个很好的效果; 当它们重叠时,它们会更暗.

from pylab import *
for _ in xrange(1000) :
    plot(np.random.randn(2),np.random.randn(2),alpha=0.1,color='k')
show()
Run Code Online (Sandbox Code Playgroud)

它看起来像这样:

许多线重叠

但是如果你像这样绘制一条与它自身重叠的长线,那么该线就不会"与自身相互作用".它看起来像这样:

一条线重叠多次

我想绘制一条与自身重叠的曲线,这样它与自身重叠的越多,它就越暗.如果我使用一个循环来分解曲线并分别绘制每个线段,我得到了我想要的东西,但是我也得到了线段相遇的丑陋和不可接受的伪像,使得曲线看起来像点线或虚线.这个:

到目前为止尽力而为

是否有任何好的方法来绘制曲线,使其在与自身重叠时变得更暗,但是你没有得到像刚刚描述的那样的工件?

python alpha matplotlib

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

调用 __device__ 函数会影响 CUDA 中使用的寄存器数量吗?

我在很多地方读到过,__device__函数几乎总是由 CUDA 编译器内联。__device__那么,当我将代码从内核移动到内核调用的函数时,(通常)使用的寄存器数量不会增加,这样说是否正确?

例如,以下代码片段使用相同数量的寄存器吗?他们的效率相同吗?

片段 1

__global__ void manuallyInlined(float *A,float *B,float *C,float *D,float *E) {
    // code that manipulates A,B,C,D and E 
}
Run Code Online (Sandbox Code Playgroud)

片段2

__device__ void fn(float *A,float *B,float *C,float *D,float *E) {
    // code that manipulates A,B,C,D and E 
}


__global__ void manuallyInlined(float *A,float *B,float *C,float *D,float *E) {
    fn(A,B,C,D,E);
}
Run Code Online (Sandbox Code Playgroud)

performance cuda inline

2
推荐指数
1
解决办法
876
查看次数

使用布尔代数和传递的参数在CUDA中实现类似内核的两个版本是否有效?

我有以下CUDA核心,其中执行计算上昂贵的计算然后在两个操作中使用.

偶尔,我想myKernel没有operationOne.我知道代码分支通常是个坏主意,但是如果所有线程都运行相同的分支,那么仍然存在很大的低效率吗?即以下是一个坏主意?

__global__ void myKernel(bool doOpOne, ...) {
    // usefulValue is computed

    if(doOpOne) {
         // perform operation one
    }
    // perform operation two
}
Run Code Online (Sandbox Code Playgroud)

performance cuda

2
推荐指数
1
解决办法
51
查看次数

Python函数式编程引用构造函数

我想有一个ptr可以指向以下一的函数指针:

  • 一个功能,

  • 对象实例的方法,或

  • 对象的构造函数.

在后一种情况下,执行ptr()应该实例化该类.

def function(argument) :
    print("Function called with argument: "+str(argument))

class C(object) :
    def __init__(self,argument) :
        print("C's __init__ method called with argument: "+str(argument))

    def m(self,argument) :
        print("C's method 'm' called with argument: "+str(argument))

## works
ptr = function
ptr('A')

## works
instance = C('asdf')
ptr = instance.m
ptr('A')

## fails
constructorPtr = C.__init__
constructorPtr('A')
Run Code Online (Sandbox Code Playgroud)

这产生了输出:

Function called with argument: A

C's __init__ method called with argument: asdf

C's method 'm' called …
Run Code Online (Sandbox Code Playgroud)

python constructor functional-programming

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

如何更改kivy RenderContext的片段着色器?

我有一个kivy应用程序,我希望在特定RenderContext上绘制的所有内容都应用着色器后处理效果(类似于文档中kivy-examples中的EffectWidget示例中演示的效果).

worldWidget 的构造函数中,我创建了RenderContext

self.prc = RenderContext()
Run Code Online (Sandbox Code Playgroud)

设置其投影矩阵(这是有效的)

self.prc['projection_mat'] = proj_mat
Run Code Online (Sandbox Code Playgroud)

然后尝试将其片段着色器设置为默认片段着色器的最小副本,该着色器应该只将十分之一变为不透明(基本上使屏幕变暗).

self.prc.shader.fs = """
#ifdef GL_ES
    precision highp float;
#endif

/* Outputs from the vertex shader */
varying vec4 frag_color;
varying vec2 tex_coord0;

/* uniform texture samplers */
uniform sampler2D texture0;

void main (void){
    gl_FragColor = 0.1*frag_color * texture2D(texture0, tex_coord0);
}
"""
Run Code Online (Sandbox Code Playgroud)

如果此着色器的代码不正确,则程序不会运行,抱怨着色器编译错误,这表示正在编译着色器.但是,我没有看到着色器的任何影响.绘制的所有内容prc都是绘制的,但是在正常的不透明度下.我究竟做错了什么?谢谢你的时间!


编辑!

我被要求提供一个完整的可运行示例.以下程序绘制两个矩形.左侧的Rectangle有自己的RenderContext,不受灰度后处理影响(它绘制为红色)的影响.右边的矩形没有自己的RenderContext中,它正确地受到影响后处理.

这是代码:

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.floatlayout import FloatLayout
from kivy.graphics import *
from …
Run Code Online (Sandbox Code Playgroud)

glsl post-processing kivy

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