我试图使用openmp计算2d矩阵的平均值.这个2d矩阵实际上是一个图像.
我正在进行线程划分数据.例如,如果我有N个线程,则使用thread0处理Rows/N个行,依此类推.
我的问题是我可以使用openmp减少条款"#pragma omp parallel"吗?就像是
#pragma omp parallel reduction( + : sum )
{
if( thread == 0 )
bla bla code
sum = sum + val;
else if( thread == 1 )
bla bla code
sum = sum + val;
}
Run Code Online (Sandbox Code Playgroud) 我正在学习使用OpenMP执行for循环的paralel的基础知识.
可悲的是,我的paralel程序运行速度比串行版慢10倍.我究竟做错了什么?我错过了一些障碍吗?
double **basicMultiply(double **A, double **B, int size) {
int i, j, k;
double **res = createMatrix(size);
omp_set_num_threads(4);
#pragma omp parallel for private(k)
for (i = 0; i < size; i++) {
for (j = 0; j < size; j++) {
for (k = 0; k < size; k++) {
res[i][j] += A[i][k] * B[k][j];
}
}
}
return res;
}
Run Code Online (Sandbox Code Playgroud)
非常感谢你!
我正在尝试学习基于OMP库任务的编程,作为一个例子,我复制并粘贴了从书中获取的以下代码并输出错误
'task' : expected an OpenMP directive name
Run Code Online (Sandbox Code Playgroud)
和
'taskwait' : expected an OpenMP directive name
Run Code Online (Sandbox Code Playgroud)
我可以运行omp并行循环而不是任务.你知道omp任务是否需要在visual studio中进一步调整?
#include "stdafx.h"
#include <omp.h>
int fib(int n)
{
int i, j;
if (n<2)
return n;
else
{
#pragma omp task shared(i) firstprivate(n)
i=fib(n-1);
#pragma omp task shared(j) firstprivate(n)
j=fib(n-2);
#pragma omp taskwait
return i+j;
}
}
int main()
{
int n = 10;
omp_set_dynamic(0);
omp_set_num_threads(4);
#pragma omp parallel shared(n)
{
#pragma omp single
printf ("fib(%d) = %d\n", n, fib(n));
}
}
Run Code Online (Sandbox Code Playgroud) TL; DR - GCC(trunk)是否已支持OpenMP 4.0卸载到nVidia GPU?
如果是这样,我做错了什么?(以下描述).
我正在运行Ubuntu 14.04.2 LTS.
我查看了最近的GCC主干(2015年3月25日).
我根据Ubuntu入门指南安装了CUDA 7.0工具包.CUDA样品成功运行,即检测到我的GeForce GT 730.deviceQuery
我已按照https://gcc.gnu.org/wiki/Offloading以及https://gcc.gnu.org/install/specific.html#nvptx-x-none中的说明进行操作
我已经安装了nvptx工具和nvptx-newlib(configure,make,sudo make install),newlib还与海湾合作委员会的后备箱目录内的链接ln -s.
然后我构建了目标加速器nvptx-none编译器:
../../trunk/configure --target=nvptx-none --enable-as-accelerator-for=x86_64-pc-linux-gnu --with-build-time-tools=/usr/local/nvptx-none/bin --disable-sjlj-exceptions --enable-newlib-io-long-long
make -j 9
sudo make install DESTDIR=/install
Run Code Online (Sandbox Code Playgroud)
...和主机GCC编译器本身:
../trunk/configure --build=x86_64-pc-linux-gnu --host=x86_64-pc-linux-gnu --target=x86_64-pc-linux-gnu --enable-offload-targets=nvptx-none=/install/prefix --with-cuda-driver=/usr/local/cuda --enable-languages=c,c++
make -j 9
sudo make install DESTDIR=/install
Run Code Online (Sandbox Code Playgroud)
我已相应地设置了LD_LIBRARY_PATH …
我有一个使用 xgboost 的项目。我们现在将项目转移到容器。但是使用pip安装后,它抛出以下错误:
Traceback (most recent call last):
File "restart_db.py", line 5, in <module>
from autoai.core.providers import GlobalEnrichmentProvider
File "/volumes/code/autoai/core/providers/__init__.py", line 1, in <module>
from .files_providers import CsvProvider, TsvProvider, ExcelProvider, FileProvider
File "/volumes/code/autoai/core/providers/files_providers.py", line 10, in <module>
from .base import BaseProvider, BaseInMemoryProvider
File "/volumes/code/autoai/core/providers/base.py", line 1, in <module>
from autoai.models.dataset_connection import JoinTypes
File "/volumes/code/autoai/models/__init__.py", line 5, in <module>
from .classifier import Classifier
File "/volumes/code/autoai/models/classifier.py", line 8, in <module>
from eli5 import explain_prediction
File "/volumes/dependencies/lib/python3.6/site-packages/eli5/__init__.py", line 53, in <module>
from .xgboost …Run Code Online (Sandbox Code Playgroud) 我有两个类似的代码.
第一
#pragma omp parallel for shared(g) private(i) schedule(dynamic, 1)
for(i = (*g).actualNumberOfChromosomes; i < (*g).maxNumberOfChromosomes; i++)
{
AddCrossoverChromosome(g, i); // it doesnt change actualNumberOfChromosomes
#pragma omp atomic
(*g).actualNumberOfChromosomes++;
}
Run Code Online (Sandbox Code Playgroud)
第二
#pragma omp parallel for shared(g) private(i) schedule(static, 1)
for(i = (*g).actualNumberOfChromosomes; i < (*g).maxNumberOfChromosomes; i++)
{
AddCrossoverChromosome(g, i); // it doesnt change actualNumberOfChromosomes
#pragma omp atomic
(*g).actualNumberOfChromosomes++;
}
Run Code Online (Sandbox Code Playgroud)
唯一的区别在于第一行.第一个代码工作正常,但第二个代码崩溃.为什么?
问题在某处actualNumberOfChromosomes,但我想了解原因,而不只是解决这个问题.我可以通过创建附加变量解决这个问题p,并分配actualNumberOfChromosomes给它,并改变环路,这样i等于p.
我需要知道我的应用程序通过OpenMP生成的线程总数.不幸的是,该omp_get_num_threads()功能也不会在这里,因为它只产生的线程在目前球队数量的工作.
但是,我的代码以递归方式运行(基本上是分而治之),只要仍有空闲的处理器,我想生成新的线程,但不会更多.
有没有办法绕过限制omp_get_num_threads并获得正在运行的线程总数?
如果需要更多细节,请考虑以下伪代码,它们非常接近地模拟我的工作流程:
function divide_and_conquer(Job job, int total_num_threads):
if job.is_leaf(): # Recurrence base case.
job.process()
return
left, right = job.divide()
current_num_threads = omp_get_num_threads()
if current_num_threads < total_num_threads: # (1)
#pragma omp parallel num_threads(2)
#pragma omp section
divide_and_conquer(left, total_num_threads)
#pragma omp section
divide_and_conquer(right, total_num_threads)
else:
divide_and_conquer(left, total_num_threads)
divide_and_conquer(right, total_num_threads)
job = merge(left, right)
Run Code Online (Sandbox Code Playgroud)
如果我使用total_num_threads值4来调用此代码,则条件注释(1)将始终求值true(因为每个线程团队最多包含两个线程),因此代码将始终生成两个新线程,无论已经运行了多少线程在更高的层次上.
我正在寻找一种独立于平台的方法来确定我的应用程序中当前运行的线程总数.
c ++新手在这里.
在过去的几天里,我一直在提高我的记忆管理技能,根据valgrind,我的程序不再泄漏内存.事实上,我根本没有得到valgrind的警告.
但是,当我在我的代码中添加openmp循环时,我开始在valgrind(memcheck)中得到以下错误:(但没有明确丢失的块)
==6417== 304 bytes in 1 blocks are possibly lost in loss record 3 of 4
==6417== at 0x4C279FC: calloc (vg_replace_malloc.c:467)
==6417== by 0x4011868: _dl_allocate_tls (dl-tls.c:300)
==6417== by 0x6649871: pthread_create@@GLIBC_2.2.5 (allocatestack.c:570)
==6417== by 0x62263DF: ??? (in /usr/lib/x86_64-linux-gnu/libgomp.so.1.0.0)
==6417== by 0x42A2BB: Blade::updatePanels() (blade.cpp:187)
==6417== by 0x418677: VLMsolver::initialiseBlade() (vlmsolver.cpp:590)
==6417== by 0x415A1B: VLMsolver::start(std::string) (vlmsolver.cpp:80)
==6417== by 0x40B28C: main (charybdis.cpp:176)
Run Code Online (Sandbox Code Playgroud)
和:
==6417== 1,568 bytes in 1 blocks are still reachable in loss record 4 of 4
==6417== at 0x4C28FAC: malloc …Run Code Online (Sandbox Code Playgroud) 我有通过cout和cerr写入控制台的OpenMP线程.这当然不安全,因为输出可以交错.我可以做点什么
#pragma omp critical(cerr)
{
cerr << "my variable: " << variable << endl;
}
Run Code Online (Sandbox Code Playgroud)
如果可以用线程安全版本替换cerr会更好,类似于valgrind DRD手册中解释的方法(http://valgrind.org/docs/manual/drd-manual.html#drd-manual.effective- use)涉及从std :: ostreambuf派生一个类.理想情况下,最后我会用自己的线程cerr替换cerr,例如:
tcerr << "my variable: " << variable << endl;
Run Code Online (Sandbox Code Playgroud)
一旦遇到"endl",这样的类就可以打印到控制台.我不介意来自不同线程的行是否是交错的,但每行应仅来自一个线程.
我真的不明白C++中的所有这些流是如何工作的,它太复杂了.有没有人这样的课程或者可以告诉我如何为此目的创建这样的课程?
Clang不支持OpenMP(但是)是否可以用C++ 11实现"并行"?