for (int y = 0; y < GameBoard.GameBoardHeight; y++)
for (int x = 0; x < GameBoard.GameBoardWidth; x++)
{
if (GetSquare(x, y) == "Empty")
{
RandomPiece(x, y);
}
}
Run Code Online (Sandbox Code Playgroud)
第一个for循环没有大括号,下一行甚至不是带有a的语句;.这只是一个for循环.
怎么了?
GLSL 有lessThan、greaterThan等组件明智的函数,它们返回bvec.
还有any()和all(),但好像没有and()。
如果我有两个bvec3s 并且想要一个新的bvec3,相当于:
bvec3 new = bvec3(two.x && one.x, two.y && one.y, two.z && one.z);
Run Code Online (Sandbox Code Playgroud)
有没有更快的方法或更优化的方法来做到这一点?
我正在尝试编写高度优化的 GLSL 代码。
我有一个看起来像这样的联盟
union bareVec8f {
__m256 m256; //avx 8x float vector
float floats[8];
int ints[8];
inline bareVec8f(){
}
inline bareVec8f(__m256 vec){
this->m256 = vec;
}
inline bareVec8f &operator=(__m256 m256) {
this->m256 = m256;
return *this;
}
inline operator __m256 &() {
return m256;
}
}
Run Code Online (Sandbox Code Playgroud)
__m256需要在32字节边界上对齐以与SSE函数一起使用,并且应该是自动的,即使在联合内也是如此.
而当我这样做
bareVec8f test = _mm256_set1_ps(1.0f);
Run Code Online (Sandbox Code Playgroud)
我遇到了分段错误.由于我制作的构造函数,此代码应该可以工作.但是,当我这样做
bareVec8f test;
test.m256 = _mm256_set1_ps(8.f);
Run Code Online (Sandbox Code Playgroud)
我没有得到分段错误.
因此,因为工作正常,所以联合可能正确对齐,但是看起来构造函数只会导致一些分段错误
我正在使用gcc 64bit windows编译器
---------------------------------编辑Matt设法生成了这里似乎发生的最简单的错误示例.
#include <immintrin.h>
void foo(__m256 x) {}
int main()
{
__m256 r = _mm256_set1_ps(0.0f);
foo(r);
}
Run Code Online (Sandbox Code Playgroud)
我正在编译 -std=c++11 -mavx
我有:
struct vec {
__m128 m128;
inline vec(__m128 m128) : m128(m128) {
}
}
Run Code Online (Sandbox Code Playgroud)
所以现在__m128可以隐式转换为vec,但是当我使用它时,如:
void doStuff(vec &v) { *stuff be doing* }
doStuff( _mm_set1_ps(1.0f)); //mm_set_ps returns __m128
Run Code Online (Sandbox Code Playgroud)
我收到一个错误说:
无法从__m128转换为&vec
那么问题是什么以及如何解决?
不幸的是我有一个AMD打桩机cpu,它似乎与AVX指令有问题:
使用256位AVX寄存器进行的内存写入非常慢.测量的吞吐量比之前的型号(Bulldozer)慢5到6倍,比两个128位写入慢8到9倍.
根据我自己的经验,我发现mm256内在函数比mm128要慢得多,而且我假设它是因为上述原因.
我真的想编写最新的指令集AVX,同时仍然能够以合理的速度在我的机器上测试构建.有没有办法迫使mm256内在函数使用SSE指令?我正在使用VS 2015.
如果没有简单的方法,那么艰难的方式呢.替换<immintrin.h>为包含我自己的内在函数定义的自定义标题,可以编码为使用SSE?不确定这是多么合理,在我完成这项工作之前,如果可能的话,更喜欢更简单的方法.
这似乎应该有一个明显的答案,但我找不到它.
var mongoose = require('mongoose')
/**
* @param {Mongoose.Model} fooModel
*/
function ExecuteAQueryUsingModel(fooModel) {
Run Code Online (Sandbox Code Playgroud)
我基本上试图将参数定义为a Mongoose.Model,一个用mongoose模型构造函数构造的变量.我不知道如何将jsdoc类型设置为外部定义的类型.
由于枚举是值类型且内部是整数,因此将它们转换为int的费用是否比通常的转换便宜?
如果速度更快,是否是因为它是值类型而不是引用类型?
所以基本上
int num = rand(2); //random number from 0-2
int otherNum, otherOtherNum;
otherNum = implement this
otherOtherNum = implement this
Run Code Online (Sandbox Code Playgroud)
例如,如果num为2,则otherNum和otherOtherNum必须设置为0和1(或1和0).
你会如何实现这个?假设您不能使用分支或查找表.是的,我想要一点操纵解决方案.是的,我希望解决方案比使用模数运算符的解决方案更快(因为这实际上是一个划分).
我认为查找可能是最快但不确定的,我不喜欢那个解决方案.
我正在尝试使用AVX指令和Windows 64位。我对g ++编译器很满意,因此我一直在使用它,但是,这里描述了一个大错误,并且在这里提出了非常粗糙的解决方案。
基本上,m256变量无法在堆栈上对齐以与avx指令一起正常工作,它需要32字节对齐。
我链接的另一个堆栈问题中提出的解决方案确实很糟糕,特别是如果您考虑性能的话。您需要在每次调试时运行的python程序,将指令替换为其次优的未对齐指令,或者过度分配代码并在代码中进行大量昂贵的hacker指针数学运算以获取正确的对齐方式。如果您使用指针数学解决方案,我认为甚至还会出现段错误,因为您无法控制分配或r值/临时值。
我正在寻找一种更简单,更便宜的解决方案。我不介意切换编译器,宁愿不要,但是如果这是我会的最佳解决方案。但是,我对该错误的理解很差,因为它是Windows 64位的固有功能,所以切换编译器会有所帮助,还是其他编译器也会遇到相同的问题?
SSE没有提供一种以可变数量移动打包整数的方法(我可以使用任何AVX和更旧的指令).你只能做统一的轮班.我试图为向量中的每个整数实现的结果是这个.
i[0] = i[0] & 0b111111;
i[1] = (i[1]>>6) & 0b111111;
i[2] = (i[2]>>12) & 0b111111;
i[3] = (i[3]>>18) & 0b111111;
Run Code Online (Sandbox Code Playgroud)
本质上是尝试在每个整数中隔离不同的6位组.
那么什么是最佳解决方案?
我想到的事情:你可以模拟一个变量右移,左移和左移一致.我想过将打包的整数乘以不同的量(因此模拟左移).然后结果,你可以做一个统一的右移得到答案.这个问题我会用乘法的具体运会_mm_mullo_epi32,其中有令人失望的等待时间(10个循环的Haswell),并给予我的程序那就要等待结果造成这个特殊的结果是下一个指令的依赖.总的来说,我认为这种方法只比蛮力方法快一点,后者是解包,使用标量指令进行移位,然后重新打包向量,我认为这需要大约20个周期.