Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.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
C++ 如何使用openmp并行化聚合代码?_C++_Openmp_Aggregate Functions_Aggregate - Fatal编程技术网

C++ 如何使用openmp并行化聚合代码?

C++ 如何使用openmp并行化聚合代码?,c++,openmp,aggregate-functions,aggregate,C++,Openmp,Aggregate Functions,Aggregate,实际上,我想对表进行聚合,表中的每一列都是一个数组。所以我需要扫描表并进行聚合。但是Openmp似乎不支持在reduce指令后使用数组名。所以,我如何使用openmp并行化我的聚合代码?thx我认为您在openmp中面临两个不同的限制,这两个限制阻止了您的工作: 总和累加器变量不是简单的变量,而是要传递给OpenMP的数组项。OpenMP不支持这一点。从数组中获取值,将其写入局部变量,对局部变量进行约简,然后将值写回数组。 条目具有用户定义的数据类型。OpenMP也不支持减少这些。因此,所有要求

实际上,我想对表进行聚合,表中的每一列都是一个数组。所以我需要扫描表并进行聚合。但是Openmp似乎不支持在reduce指令后使用数组名。所以,我如何使用openmp并行化我的聚合代码?thx

我认为您在openmp中面临两个不同的限制,这两个限制阻止了您的工作:

总和累加器变量不是简单的变量,而是要传递给OpenMP的数组项。OpenMP不支持这一点。从数组中获取值,将其写入局部变量,对局部变量进行约简,然后将值写回数组。 条目具有用户定义的数据类型。OpenMP也不支持减少这些。因此,所有要求和的条目的6个成员都必须成为单独的局部变量。您可以将6个变量的列表传递给OpenMP reduction子句。
我说得对吗,你想得到一列的和吗?得到一列的和,我可以使用this:reduce+:sum,但是在我的代码中,有8列,我需要根据8列中的两列得到列的和。根据两列的值,我有一个var-hashtable[2][3]。这个hashtable存储了不同情况的总和,实际上这只是两列的6种情况。你能提供无与伦比的代码吗?你已经试过什么了吗;对于i=0;idefine Entry哈希表[p_linestatus[i][p_returnflag[i]],linestatus和returnflag是两列感谢您的回答,您的意思是我唯一可以这样做的方法是在struct数组中声明var的其他对应变量。这意味着如果我有一个struct aggr_t{long a,double b,double c}哈希表[2][3],我应该重新声明24 var以使用reduce指令吗?还有其他方法看起来不笨拙吗?Thxhmm,我没有看到宏条目包含对循环变量I的引用。这会使事情进一步复杂化,你是对的,你需要很多很多局部变量。所以如果你不想这样做,我想你有两个选择:1。不要使用任何缩减,而是让所有线程在相同的共享数据上工作,这意味着您需要同步以避免丢失更新,这可能会扼杀您的加速。2.编写自己的缩减代码。选项2的附加信息:创建一个长跨度并行杂注,其中包含3个部分:a.为每个线程创建原始哈希表的副本,B.然后在外部并行杂注中创建一个omp for循环,其中每个线程仅在其本地副本上工作,然后,仍然在外部并行杂注中使用同步进行缩减。您可以在这里找到一个通用结构的示例:很高兴它能帮助您:-