我正在使用的算法花费了大部分时间将一个数组与一行矩阵进行比较.如果任何第i个元素相同,则算法调用过程A,如果没有元素相等,则调用过程B. 例如:
[1, 4, 10, 3, 5]并且[5, 3, 0, 3, 0]调用A()因为对于第4个位置,两个数组中的值都是3.
[1, 4, 10, 3, 5]并且[5, 3, 0, 1, 0]调用B()因为对于相同的位置,值永远不会相同.
注意(1)数组和矩阵行总是具有相同的大小N,以及(2)算法A() 在至少一个值匹配时调用.
在C中执行此操作的最简单但非常天真的方法是:
for(int i=0; i<N; i++)
if( A[i] == B[i] ){
flag = 1;
break;
}
Run Code Online (Sandbox Code Playgroud)
这仍然非常低效.在最坏的情况下,我将进行N次比较.这里真正的问题是该算法可以进行数万亿次这些比较.
N(矩阵中数组/行的大小)从100到1000不等.我想加快这个程序.我看了矢量化,发现我可以使用cmpeq_pd.但是,矢量化仍然有限,因为我的所有条目都是 longs.有没有人有想法?我可以申请面具吗?
更多信息/背景:
测量我的应用程序(使用OpenMP编写的多线程)使用的带宽的最简单,最有效的方法是什么?我跑了STREAM以获得最大值.可持续的带宽,我现在想知道我是否正在使整个可用带宽饱和.
我找到了几个相关的问题(例如主内存带宽测量),但我找不到这个问题的答案;
可悲的是,我不能使用VTune,但我可以使用PAPI计数器;
我的主要目标是找出我的应用程序的可扩展性是否与内存带宽的饱和度相关联.
谢谢
我正在矢量化一段代码,在某些时候我有以下设置:
register m128 a = { 99,99,99,99,99,99,99,99 }
register m128 b = { 100,50,119,30,99,40,50,20 }
Run Code Online (Sandbox Code Playgroud)
我目前正在short这些寄存器中打包,这就是为什么每个寄存器有8个值.如果第i个值大于或等于(在这种情况下,用常数99填充),我想要做的是b用相应的值减去第i个元素.为此,我首先在和之间使用大于或等于的操作,这产生了这个例子:abaaba
register m128 c = { 1,0,1,0,1,0,0,0 }
Run Code Online (Sandbox Code Playgroud)
为了完成操作,我想使用乘法和减法,即存储在b操作中b -= a*c.结果将是:
b = { 1,50,20,30,0,40,50,20 }
Run Code Online (Sandbox Code Playgroud)
有没有做这种事的操作?我发现的是Haswell的融合操作,但我目前正在研究Sandy-Bridge.此外,如果有人有更好的想法这样做,请告诉我(例如我可以做一个逻辑减法:如果1 c然后我减去,否则没有.
我不太擅长C ++,目前正在将一些代码移植到C中。它分配了很多这样的对象:
o_list::Node** nodes = (o_list::Node**)malloc(SIZE*sizeof(o_list::Node*));
Run Code Online (Sandbox Code Playgroud)
然后在每个职位上填写:
for(int u=0;u<SIZE;u++)
nodes[u] = new o_list::Node();
Run Code Online (Sandbox Code Playgroud)
据我了解,关于连续内存的唯一保证是指向对象的指针实际上是连续的,也就是说,可能发生以下情况:
_____________________
|x||x||x||x||x||x||x|x| -> contiguous array of pointers;
| \ \
| \ \______
| \ \
O O O -> not contiguous positions of objects;
Run Code Online (Sandbox Code Playgroud)
为了解决这个问题,我尝试先分配第一个数组(指针),然后再分配一个对象数组,然后将指针分配到正确的位置,如下所示:
o_list::Node** nodes = (o_list::Node**)malloc(SIZE*sizeof(o_list::Node*));
o_list::Node* contObjs = (o_list::Node*)malloc(SIZE*sizeof(o_list::Node));
for(int u=0;u<SIZE;u++){
contObjs[u] = o_list::Node();
nodes[u] = &contObjs[u];
}
Run Code Online (Sandbox Code Playgroud)
但这会导致分段错误。我想知道我的假设是否正确,以及为什么第二个选项中存在细分错误。
谢谢
我有一台具有1.1计算能力的CUDA GPU的机器.我想重新安装CUDA,我想我会用5.0;
有没有CUDA功能和CUDA版本之间的兼容性?使用带有CC 1.1的CUDA 5.0会有麻烦吗?GPU?
谢谢!
在Linux中,内核在我们实际使用该内存之前不会分配任何物理内存页面,但我在这里很难找到它为什么实际上分配这个内存:
for(int t = 0; t < T; t++){
for(int b = 0; b < B; b++){
Matrix[t][b].length = 0;
Matrix[t][b].size = 60;
Matrix[t][b].pointers = (Node**)malloc(60*sizeof(Node*));
}
}
Run Code Online (Sandbox Code Playgroud)
然后我访问这个数据结构,为它添加一个元素,如下所示:
Node* elem = NULL;
Matrix[a][b].length++;
Matrix[a][b]->pointers[ Matrix[a][b].length ] = elem;
Run Code Online (Sandbox Code Playgroud)
基本上,我用htop运行我的程序,如果增加no,Linux会分配更多的内存.我在上面的代码中有"60".为什么?它不应该只在第一个元素添加到数组时分配一个页面吗?