Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“英特尔MKL”或类似的库是否提供了一种矢量化方法来计算满足C中某些条件的数组中的元素数? 问题 我正在用一些相当大的数组(从数以百万计的浮点和UP)来执行和优化优化算法,并且主要使用英特尔MKL在C(不是C++中,至少到目前为止)来压缩每一个可能的性能位。现在我遇到了一个愚蠢的问题——我有一个参数,它为一组(数千万)系数的子集设置最大值和最小值。实际上,使用MKL函数应用这些最大值和最小值是很容易的——我可以为每个元素创建大小相等的向量,并使用V?Fmax和V?Fmin来应用它们。但我还需要在我的误差度量中考虑这种剪裁,这要求我计算超出这些约束的元素数量_C_Vectorization_Hpc_Intel Mkl_Large Data Volumes - Fatal编程技术网

“英特尔MKL”或类似的库是否提供了一种矢量化方法来计算满足C中某些条件的数组中的元素数? 问题 我正在用一些相当大的数组(从数以百万计的浮点和UP)来执行和优化优化算法,并且主要使用英特尔MKL在C(不是C++中,至少到目前为止)来压缩每一个可能的性能位。现在我遇到了一个愚蠢的问题——我有一个参数,它为一组(数千万)系数的子集设置最大值和最小值。实际上,使用MKL函数应用这些最大值和最小值是很容易的——我可以为每个元素创建大小相等的向量,并使用V?Fmax和V?Fmin来应用它们。但我还需要在我的误差度量中考虑这种剪裁,这要求我计算超出这些约束的元素数量

“英特尔MKL”或类似的库是否提供了一种矢量化方法来计算满足C中某些条件的数组中的元素数? 问题 我正在用一些相当大的数组(从数以百万计的浮点和UP)来执行和优化优化算法,并且主要使用英特尔MKL在C(不是C++中,至少到目前为止)来压缩每一个可能的性能位。现在我遇到了一个愚蠢的问题——我有一个参数,它为一组(数千万)系数的子集设置最大值和最小值。实际上,使用MKL函数应用这些最大值和最小值是很容易的——我可以为每个元素创建大小相等的向量,并使用V?Fmax和V?Fmin来应用它们。但我还需要在我的误差度量中考虑这种剪裁,这要求我计算超出这些约束的元素数量,c,vectorization,hpc,intel-mkl,large-data-volumes,C,Vectorization,Hpc,Intel Mkl,Large Data Volumes,但是,我找不到一个MKL函数,它允许我计算满足某些条件的元素数量,以及使用Python或MATLAB中的NumPy创建和求和逻辑数组的方式。令人恼火的是,当我尝试用谷歌搜索这个问题时,我只得到了与Python和R相关的答案 显然,我可以编写一个循环,为满足其中一个条件的每个元素增加一个计数器,但是如果有一个已经优化的实现允许我实现这一点,那么我更愿意这样做,因为我的数组太大了 是否有人知道一种聪明的方法,可以通过使用“英特尔MKL”(可能使用统计工具箱或一些创造性地使用初等函数?),一种类似的优

但是,我找不到一个MKL函数,它允许我计算满足某些条件的元素数量,以及使用Python或MATLAB中的NumPy创建和求和逻辑数组的方式。令人恼火的是,当我尝试用谷歌搜索这个问题时,我只得到了与Python和R相关的答案

显然,我可以编写一个循环,为满足其中一个条件的每个元素增加一个计数器,但是如果有一个已经优化的实现允许我实现这一点,那么我更愿意这样做,因为我的数组太大了

是否有人知道一种聪明的方法,可以通过使用“英特尔MKL”(可能使用统计工具箱或一些创造性地使用初等函数?),一种类似的优化库,或者一种高度优化的手工编码方法,来实现这一点?我一直绞尽脑汁想想出一些开箱即用的方法,但结果却是空的

请注意,我必须能够在C中完成这项工作,将这项任务转移到Python前端是不可行的,我确实需要首先用C编写这个特定的子程序

谢谢

> P>如果使用C++,从算法库中执行“代码> > PARIONSEQ 可以并行化并计数计数。至少在Linux上,它通常使用Intel TBB来实现这一点


在c语言中,这可能不那么容易。因为c没有模板、可调用项或lambda之类的概念,所以专门化泛型(提供的库)
count()
-函数的唯一方法是将函数指针作为回调传递(就像
qsort()
那样)。除非编译器设法对回调进行设备化和内联,否则根本无法进行矢量化,留下(可能是线程并行化的)标量代码。OTOH,如果您使用gcc vector(我最喜欢的!)作为示例,您可以得到矢量化,但不能得到并行化。你可以试着把这些方法结合起来,但我想说的是自己克服了,使用C++。 然而,如果您只需要矢量化,几乎可以肯定的是,您可以只编写顺序代码并让编译器自动矢量化,除非应该计算的谓词编写得不好,或者编译器被损坏

因为。如果至少有sse4指令可用(
-msse4
),gcc将x86上的代码矢量化。使用AVX[2/512](
-mavx/-mavx2/-mavx512f
)可以获得更宽的向量,一次生成更多元素。通常,如果您在运行程序的同一硬件上编译,我建议让gcc自动检测最佳的指令集扩展(
-march=native

请注意,在提供的代码中,条件不应使用短路或(
|
),因为如果当前元素与
min
-向量的比较已为真,则从
max
-向量读取的内容在语义上是禁止的,这严重阻碍了向量化(尽管avx512可能会以某种灾难性的减速将其矢量化)

我很确定gcc在为avx512生成的代码中并不是最理想的,因为它可以使用
kor[b/w/d/q]
在掩码寄存器中执行k-reg(掩码寄存器)
,但可能是对avx512有更多经验的人(*cougth*Peter Cordes*cough*)如果你使用C++,从算法库中执行“代码> > PARIONSEQ 可以并行化和计数计数。在Linux上,至少它通常使用英特尔TBB来完成。
在c中这可能不那么容易。因为c没有模板、可调用项或lambda之类的概念,所以专门化泛型(库提供的)
count()
-函数的唯一方法是将函数指针作为回调传递(如
qsort()
所做的)。除非编译器设法对回调进行设备化和内联,否则您根本无法进行矢量化,留下(可能是线程并行化的)标量代码。OTOH,如果您使用gcc vector(我最喜欢的!)你可以得到矢量化,但不是并行化。你可以尝试将这些方法结合起来,但我想说一下自己,使用C++。 然而,如果您只需要矢量化,几乎可以肯定的是,您可以只编写顺序代码并让编译器自动矢量化,除非应该计算的谓词编写得不好,或者编译器被损坏

如果至少有sse4指令可用(
-msse4
),则.gcc将x86上的代码矢量化。使用AVX[2/512](
-mavx/-mavx2/-mavx512f
)您可以使用更宽的向量一次执行更多的元素。通常,如果您在运行程序的同一硬件上编译,我建议让gcc自动检测最佳的指令集扩展(
-march=native

请注意,在提供的代码中,这些条件不应使用短路或(
|
),因为如果compa