Tag: 总和

使用C与OpenMP求和

我一直试图将这段代码并行化大约两天并且一直存在逻辑错误。 程序是使用非常小的dx的总和找到积分的面积并计算积分的每个离散值。 我试图用openmp实现这个,但我实际上没有使用openmp的经验。 我想请你的帮助。 实际目标是在线程中并行化suma变量,以便每个线程计算更少的积分值。 程序编译成功,但是当我执行程序时,它会返回错误的结果。 #include #include #include #include int main(int argc, char *argv[]){ float down = 1, up = 100, dx, suma = 0, j; int steps, i, nthreads, tid; long starttime, finishtime, runtime; starttime = omp_get_wtime(); steps = atoi(argv[1]); dx = (up – down) / steps; nthreads = omp_get_num_threads(); tid = omp_get_thread_num(); […]

与SSE并行的前缀(累计)总和

我正在寻找有关如何与SSE进行并行前缀和的一些建议。 我有兴趣在一系列的整数,浮点数或双精度数上做这个。 我想出了两个解决方案。 一个特例和一般情况。 在这两种情况下,解决方案在与OpenMP并行的两次传递中在arrays上运行。 对于特殊情况,我在两次传球时使用SSE。 对于一般情况,我只在第二遍使用它。 我的主要问题是如何在一般情况下的第一遍中使用SSE? 以下链接simd-prefix-sum-on-intel-cpu显示字节的改进,但不是32位数据类型。 特殊情况称为特殊情况的原因是它要求数组采用特殊格式。 例如,让我们假设浮点数组中只有16个元素。 然后,如果数组像这样重新排列(结构数组结构): a[0] a[1] …a[15] -> a[0] a[4] a[8] a[12] a[1] a[5] a[9] a[13]…a[3] a[7] a[11] a[15] SSE垂直总和可用于两个通道。 但是,只有当数组已经采用特殊格式并且输出可以以特殊格式使用时,这才有效。 否则,必须在输入和输出上进行昂贵的重新排列,这将使其比一般情况慢得多。 也许我应该考虑一个不同的前缀和算法(例如二叉树)? 一般情况的代码: void prefix_sum_omp_sse(double a[], double s[], int n) { double *suma; #pragma omp parallel { const int ithread = omp_get_thread_num(); const int nthreads = […]