我正在对我之前从文件中读取的矩阵执行模板计算.我使用两种不同的矩阵(NonZero类型和Zero类型).两种类型共享边界的值(通常为1000),而其余元素对于零类型为0,对于NonZero类型为1.
代码将文件的矩阵存储在两个相同大小的分配矩阵中.然后,它使用自己的值和邻居值(添加x 4和mul x 1)在一个矩阵的每个元素中执行操作,并将结果存储在第二个矩阵中.一旦计算完成,交换矩阵的指针并且执行相同的操作有限次数.这里有核心代码:
#define GET(I,J) rMat[(I)*cols + (J)]
#define PUT(I,J) wMat[(I)*cols + (J)]
for (cur_time=0; cur_time<timeSteps; cur_time++) {
for (i=1; i<rows-1; i++) {
for (j=1; j<cols-1; j++) {
PUT(i,j) = 0.2f*(GET(i-1,j) + GET(i,j-1) + GET(i,j) + GET(i,j+1) + GET(i+1,j));
}
}
// Change pointers for next iteration
auxP = wMat;
wMat = rMat;
rMat = auxP;
}
Run Code Online (Sandbox Code Playgroud)
我暴露的情况使用固定量的500个timeSteps(外部迭代)和8192行和8192列的矩阵大小,但是在更改timeSteps或矩阵大小的数量时问题仍然存在.请注意,我只测量算法的这个具体部分的时间,因此从文件读取矩阵或其他任何因素都会影响时间度量.
它发生了什么,取决于我使用哪种类型的矩阵,我得到不同的时间,使用Zero类型时获得更差的性能(每隔一个矩阵执行与NonZero类型相同,因为我已经尝试生成一个充满随机的矩阵值).
我确定它是乘法运算,就像我删除它并只留下添加,它们执行相同的操作.注意,对于零矩阵类型,大多数类型的和的结果将为0,因此操作将为"0.2*0".
这种行为对我来说当然很奇怪,因为我认为浮点运算独立于操作数的值,这看起来不像这里的情况.我也尝试捕获并显示SIGFPE异常以防出现问题,但我没有得到任何结果.
如果有帮助,我使用的是Intel Nehalem处理器和gcc 4.4.3.
我一直在努力使用某个特定的应用程序,我已经尝试了一切.从自动向量化到手动编码的SSE内在函数.但不知何故,我无法在基于模板的应用程序上获得加速.
以下是我当前代码的片段,我使用SSE内在函数进行了矢量化.当我使用-vec-report3编译(Intel icc)时,我不断获取此消息:
remark:loop未向量化:语句无法向量化.
#pragma ivdep
for ( i = STENCIL; i < z - STENCIL; i+=4 )
{
it = it2 + i;
__m128 tmp2i = _mm_mul_ps(_mm_add_ps(_mm_load_ps(&p2[i+j*it_j-it_j4+k*it_k]),_mm_load_ps(&p2[i+j*it_j+it_j4+k*it_k])),X4_i); //loop was not vectorized: statement cannot be vectorized
__m128 tmp3 = _mm_mul_ps(_mm_add_ps(_mm_load_ps(&p2[i+j*it_j-it_j3+k*it_k]),_mm_load_ps(&p2[i+j*it_j+it_j3+k*it_k])),X3_i);
__m128 tmp4 = _mm_mul_ps(_mm_add_ps(_mm_load_ps(&p2[i+j*it_j-it_j2+k*it_k]),_mm_load_ps(&p2[i+j*it_j+it_j2+k*it_k])),X2_i);
__m128 tmp5 = _mm_mul_ps(_mm_add_ps(_mm_load_ps(&p2[i+j*it_j-it_j +k*it_k]),_mm_load_ps(&p2[i+j*it_j+it_j +k*it_k])),X1_i);
__m128 tmp6 = _mm_add_ps(_mm_add_ps(_mm_add_ps(tmp2i,tmp3),_mm_add_ps(tmp4,tmp5)), _mm_mul_ps(_mm_load_ps(&p2[it]),C00_i));
_mm_store_ps(&tmp2[i],tmp6);
}
Run Code Online (Sandbox Code Playgroud)
我错过了一些关键的东西吗 由于该消息没有说明为什么它不能被矢量化,我发现很难确定瓶颈.
更新: 仔细考虑了建议后,我按照以下方式调整了代码.我认为最好将其进一步分解,以确定实际上导致向量依赖性的语句.
//#pragma ivdep
for ( i = STENCIL; i < z - STENCIL; i+=4 )
{
it = it2 + …Run Code Online (Sandbox Code Playgroud) 首先,我应该说我想做什么,然后在下一部分(描述)中描述为实现我的目标而要做的事情。
我想从功能区“插入”选项卡中“图零件”部分的“ 普通容器”中创建“ 自定义列表主形状”。然后,我想创建另一个Master Shape,它可以用作Created Custom List Master Shape的成员形状。
换句话说,我想将“ 创建的主形状”添加到“ 自定义列表”主形状中,例如将“ 成员”和“分隔符”主形状附加到UML模具的“ 类”主形状中。
因此,在实现我的目标时遇到了一些问题,我将在下一部分中对其进行描述。
我在“ Visio模具(.vssx)”文件中创建了一些新的Master Shape,如下所示:

图1-使用旧的主形状新建的主形状
已创建属性主形状,以用作对象主形状中的成员形状,就像在UML模具的类主形状中使用的成员主形状一样。

图2-具有初始成员的类主形
从成员主形创建的属性主形已更改如下:
我向其中添加了一个形状数据(图3)。

图3-Property Master Shape的“ Shape Data”对话框
我向其中添加了一个数据图形项(图4)。

图4-属性主形的“数据图形”和“数据图形项”对话框
我更改了ShapeSheet窗口的 …
我是OpenCL的新手.
我想编写一个通用内核,以后我可以将其用途扩展到其他内存非合并模式,并将其与Rectangular stencil pattern简单配对(也避免了越界访问).
该内核控制本地内存(__local float ?lmem)的使用.
截至目前,我的.cl文件结构如下:
__kernel void kmain (
__global float ?in ,
__global float ?out ,
__global float ?in2 ,
__local float ?lmem)
{
int wg_x = get group id(0);
int wg_y = get group id(1);
int wi_x = get local id(0);
int wi_y = get local id(1);
// number of work units each work-item processes
for (int iter_x = 0; iter_x< NUM_WUS_X-1, iter_x++ ) {
for (int iter_y = …Run Code Online (Sandbox Code Playgroud) 我正在尝试生成一个frambuffer对象,并使用NDK(r5b)在本机android应用程序中使用模板.目标设备正在运行froyo 2.2,支持OpenGL ES 2.0.
所以,我一直在我的c ++本机库中编写大量的gl代码,除此之外没有遇到任何问题.我似乎无法使它工作.
这是帧缓冲区创建的代码片段.完美性很好,但屏幕仍然完全黑色.这就像我正在创建的fbo并没有真正绑定到应用程序的Java部分创建的gl表面.我的应用程序代码的其余部分都很好,如果我删除fbo创建和绑定,一切都很好,除了我没有我的应用程序所需的模板工作.
GLint backingWidth = 1024;
GLint backingHeight = 1024;
//Create the FrameBuffer and binds it
glGenFramebuffers(1, &_defaultFramebuffer);
checkGlError("glGenFramebuffers");
glBindFramebuffer(GL_FRAMEBUFFER, _defaultFramebuffer);
checkGlError("glBindFramebuffer");
//Create the RenderBuffer for offscreen rendering // Color
glGenRenderbuffers(1, &_colorRenderbuffer);
checkGlError("glGenRenderbuffers color");
glBindRenderbuffer(GL_RENDERBUFFER, _colorRenderbuffer);
checkGlError("glBindRenderbuffer color");
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA4, backingWidth, backingHeight);
checkGlError("glRenderbufferStorage color");
//Create the RenderBuffer for offscreen rendering // Depth
glGenRenderbuffers(1, &_depthRenderbuffer);
checkGlError("glGenRenderbuffers depth");
glBindRenderbuffer(GL_RENDERBUFFER, _depthRenderbuffer);
checkGlError("glBindRenderbuffer depth");
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, backingWidth, backingHeight);
checkGlError("glRenderbufferStorage depth");
//Create the RenderBuffer for offscreen rendering // Stencil
glGenRenderbuffers(1, …Run Code Online (Sandbox Code Playgroud) 我想在 OpenGL 中设置多个模板,然后绘制它们的多个组合。
例如:我有两个这样的矩形模板:

然后我想画成:
我发现可以在模板缓冲区的不同位中声明多个模板,但我不知道如何。我如何设置glStencilOp并glStencilFunc使其工作?
或者我可以(应该)使用glScissor它吗?
是否可以将函数传递给stencilJs组件?
就像是:
@Prop() okFunc: () => void;
Run Code Online (Sandbox Code Playgroud)
我有一个模态,想Ok在模态页脚中单击的按钮上动态调用传递的函数,就像onClick在普通 HTML 按钮上一样。
我恢复了从中删除的一个默认模板Collection Pane(只需单击close图标).它现在是从计算机中删除还是只是隐形?我可以从Evolus Pencil Project 下载页面下载它.但是我可以在不下载的情况下恢复它吗?
stencils ×8
c ×2
android ×1
android-ndk ×1
framebuffer ×1
function ×1
html ×1
icc ×1
kernel ×1
mockup-tool ×1
opencl ×1
opengl ×1
performance ×1
shape ×1
shapes ×1
shapesheet ×1
sketching ×1
sse ×1
visio ×1
x86 ×1