据我所知,答案是否定的.OpenCL专为多核系统而设计.
但是,有没有办法在多台计算机上使用OpenCL(每台计算机都是多核系统)?如果没有,是否需要任何其他工具,框架?
我读了一些关于分布式计算,集群计算,网格计算的文章......但我找不到满意的答案
任何想法将不胜感激
谢谢 :)
parallel-processing distributed-computing cluster-computing grid-computing opencl
目前,我必须在非常有限的硬件(只有2GB RAM的i5内核)上构建一个相当大的项目。在运行带有4个线程的make时,由于每个线程吃掉40%的RAM,gcc崩溃了。我在谷歌上搜索了一下,发现了这个链接。少数人反馈它有效,但是不是我。
这是我做的。
/usr/bin/qmake-qt4 -r -spec linux-g++ $DEBUG_FLAGS -o Makefile "QMAKE_CXXFLAGS += --param ggc-min-expand=10 --param ggc-min-heapsize=8192" /home/build-srv/LargeProject/largeProject.pro
Run Code Online (Sandbox Code Playgroud)
make输出确实具有标志:
g++ -c -pipe --param ggc-min-expand=10 --param ggc-min-heapsize=8192 -std=c++11 -std=c++11 -g -Wall -W -D_REENTRANT -fPIC -D_GLIBCXX_USE_CXX11_ABI=0 -DBASE_LIBRARY -DQT_DECLARATIVE_DEBUG -DQT_DECLARATIVE_LIB -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtNetwork -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtDeclarative...
Run Code Online (Sandbox Code Playgroud)
但是ram的用法仍然相同。唯一的方法是减少到单线程构建,这非常慢。
我做错什么了?有没有更好的解决方案呢?
更新:
我的作业是删除随机字符串中的重复项。我的想法是使用2个循环来解决问题。
第一个将扫描字符串中的每个字符。第二个将检查字符是否重复。如果是这样,请删除该字符。
string content = "Blah blah..."
for (int i = 0; i < content.size(); ++i) {
char check = content.at(i);
for (int j = i + 1; j < content.size() - 1; ++j) {
if (check == content.at(j)) {
content.erase(content.begin()+j);
}
}
}
Run Code Online (Sandbox Code Playgroud)
问题是它不起作用。它总是删除错误的字符。似乎是索引问题,但我不明白为什么。
临时解决办法是改变content.erase(content.begin()+j);为content.erase( remove(content.begin() + i+1, content.end(), check),content.end());
但我认为触发“按值删除”扫描并不是一个好方法。我想用 2 个或更少的循环来完成。
任何想法将不胜感激:)
我写了一个简单的程序来自动设置路由器的过程.检查后,我发现一个指针需要delete(QNetworkReply *reply在replyFinish())并完成工作,但在那之后程序崩溃和Qt显示它停止在一些汇编代码:(
所以我的问题是:
是否有任何常见的做法来处理这种情况(Qt显示程序在某些汇编代码中停止)
删除不再使用的指针时,我做错了什么?(非常确定)
这是代码:
#ifndef HTTPGETTER_H
#define HTTPGETTER_H
class QNetworkAccessManager;
class QNetworkReply;
class QNetworkRequest;
class QAuthenticator;
#include <QObject>
class httpGetter : public QObject
{
Q_OBJECT
private:
QNetworkAccessManager *nam;
public:
explicit httpGetter(QObject *parent=0);
~httpGetter();
public slots:
void replyFinish(QNetworkReply* reply);
void onAuthen(QNetworkReply*,QAuthenticator*);
};
Run Code Online (Sandbox Code Playgroud)
器物
#include "httpgetter.h"
#include <QtNetwork/QNetworkRequest>
#include <QtNetwork/QNetworkReply>
#include <QtNetwork/QNetworkAccessManager>
#include <QAuthenticator>
#include <QDebug>
httpGetter::httpGetter(QObject *parent) : QObject(parent)
{
nam = new QNetworkAccessManager(this);
QObject::connect(nam,SIGNAL(finished(QNetworkReply*)),this,SLOT(replyFinish(QNetworkReply*)));
QObject::connect(nam,SIGNAL(authenticationRequired(QNetworkReply*,QAuthenticator*)),this,SLOT(onAuthen(QNetworkReply*,QAuthenticator*)));
QUrl url("http://192.168.1.1");
QNetworkReply *reply= nam->get(QNetworkRequest(url));
}
httpGetter::~httpGetter(){ …Run Code Online (Sandbox Code Playgroud) 我的程序以这种方式工作:如果用户输入数据路径参数,它将使用该路径.如果不是,它使用程序的当前路径.
构造函数是Server(QString path).
显然,这不起作用:
if(!isDefaultPath)
Server server(userPath);
else
Server server(programPath);
server.doSmth();
Run Code Online (Sandbox Code Playgroud)
目前,我喜欢这个
Server serverDefault(programPath);
Server serverCustomized(userPath);
if(!isDefaultPath)
serverCustomized.doSmth();
else
serverDefault.doSmth();
Run Code Online (Sandbox Code Playgroud)
但我觉得这不好.有没有更好的方法来做到这一点?