我目前正在理论计算机科学方面做一些研究,我正在使用的主要工具之一是prolog.我发现编写非常快速的测试以反驳猜想特别方便.
但是,我已经到了蛮力搜索速度太慢的地步.虽然我可以使用不同的语言,但我使用prolog的重点是编写代码来测试假设是非常快/简单的.
我想知道,是否有Prolog的实现允许自动并行化?它不一定要快速剃刀,但理想情况下我正在寻找一些我可以将代码放入并获得至少一个小加速的东西.
我不知道这是否可行.谷歌搜索在Prolog中发现了很多关于自动并行的学术文章,但我没有遇到任何实现.但是,我真的只熟悉SWI-prolog,所以我绝对可以使用熟悉许多实现的人的建议.
我的代码使用剪切,但我相当确定我可以消除它们.至于IO,唯一的IO是打印到控制台,可能会移动到任何并行代码之外.
我试图在CUDA C++代码上运行向量步骤添加功能,但对于大小为5,000,000的大型浮点数组,它运行速度比我的CPU版本慢.以下是我所说的相关CUDA和cpu代码:
#define THREADS_PER_BLOCK 1024
typedef float real;
__global__ void vectorStepAddKernel2(real*x, real*y, real*z, real alpha, real beta, int size, int xstep, int ystep, int zstep)
{
int i = blockDim.x * blockIdx.x + threadIdx.x;
if (i < size)
{
x[i*xstep] = alpha* y[i*ystep] + beta*z[i*zstep];
}
}
cudaError_t vectorStepAdd2(real *x, real*y, real* z, real alpha, real beta, int size, int xstep, int ystep, int zstep)
{
cudaError_t cudaStatus;
int threadsPerBlock = THREADS_PER_BLOCK;
int blocksPerGrid = (size + threadsPerBlock -1)/threadsPerBlock;
vectorStepAddKernel2<<<blocksPerGrid, …Run Code Online (Sandbox Code Playgroud) 我有这两段代码
#pragma omp parallel
#pragma omp sections
{
#pragma omp section
printf("H");
#pragma omp section
printf("e");
#pragma omp section
printf("l");
#pragma omp section
printf("l");
#pragma omp section
printf("o");
#pragma omp section
printf(" ");
#pragma omp section
printf("W");
#pragma omp section
printf("o");
#pragma omp section
printf("r");
#pragma omp section
printf("l");
#pragma omp section
printf("d");
#pragma omp section
printf("!");
}
Run Code Online (Sandbox Code Playgroud)
和
char word[] = "Hello World!";
int n;
#pragma omp parallel for
for(n=0; n<12; n++)
{
printf("%c", word[n]);
}
Run Code Online (Sandbox Code Playgroud)
而第一个总是打印Hello World! …
你知道任何并行修改的移动平均算法吗?
我想快速计算移动平均值,但不能使用顺序算法.我想使用并行算法,但我还没有找到解决方案.
我找到的最好的算法是用于测量计算机性能的顺序算法修改移动平均:
new_avg = alfa(new_time, previous_time) * new_value + (1-alfa(new_time, previous_time)) * previous_avg
alfa(new_time, previous_time) = 1- exp(-(new_time - previous_time)/moving_period)
Run Code Online (Sandbox Code Playgroud)
其他一些算法也不错,但我还没有找到并行算法.
这是一个很难的问题,我需要一些帮助.
考虑到我希望计数事件将以随机时间顺序出现 - 早期事件可以在晚期事件之后出现 - 您可以假设在处理延迟事件(或者有一些超时)之后可以跳过早期事件/变得过时.不假设事件的顺序时间顺序,并且同一时间的事件将同时出现.
我不想使用任何需要记住许多样本的算法(尤其是所有)它应该只记住时间和先前的平均值可能是一些额外的值但不是全部或相同的样本.考虑到该算法可以使一些小错误不需要是完美的,如果它的原因是一些性能提升.
如果它将使用分片但不是必需的将是非常好的.
我有一个Parallel.For和一个常规for循环做一些简单的算术,只是为了对Parallel.For进行基准测试
我的结论是,我的i5笔记本处理器上的常规速度更快.
这是我的代码
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int Iterations = int.MaxValue / 1000;
DateTime StartTime = DateTime.MinValue;
DateTime EndTime = DateTime.MinValue;
StartTime = DateTime.Now;
Parallel.For(0, Iterations, i =>
{
OperationDoWork(i);
});
EndTime = DateTime.Now;
Console.WriteLine(EndTime.Subtract(StartTime).ToString());
StartTime = DateTime.Now;
for (int i = 0; i < Iterations; i++)
{
OperationDoWork(i);
}
EndTime = DateTime.Now;
Console.WriteLine(EndTime.Subtract(StartTime).ToString());
StartTime = DateTime.Now;
Parallel.For(0, Iterations, …Run Code Online (Sandbox Code Playgroud) 我正在使用snowR中的软件包在SOCK具有在Linux OS上运行的多台机器(3)的集群上执行功能.我尝试用parLapply和运行代码clusterApply.
如果在工作级别出现任何错误,则工作节点的结果不会正确返回到master,这使得调试非常困难.我目前正在使用独立记录工作节点的每个心跳futile.logger.似乎结果是正确计算的.但是当我尝试在主节点上打印结果时(在收到工人的输出后),我得到一个错误,上面写着,Error in checkForRemoteErrors(val): 8 nodes produced errors; first error: missing value where TRUE/FALSE needed.
有没有办法更深入地调试工人的结果?
我在python中工作并尝试使用此结构转换函数:
def func(g,h,iterable):
return iterable*(g+h)
for iterable in range(20):
print func(2,3,iterable)
Run Code Online (Sandbox Code Playgroud)
进入映射函数:
def func(g,h,iterable):
return iterable*(g+h)
print map(func,2,3,range(20)) #does not work...
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是通过map()函数传递常量,目前我不知道该怎么做.
我想要这个结构,所以我可以轻松使用Ipython并行工具.
假设:
map()功能)从本质上讲,如果还不是很明显,我是一名MATLAB程序员,可以实现python的飞跃,并parfor在matlab中寻找一个很好的替代函数.
我想出了一个奇怪的错误.假设我在名为data的列表中有10个xts对象.我现在使用搜索每三个组合
data_names <- names(data)
combs <- combn(data_names, 3)
Run Code Online (Sandbox Code Playgroud)
我的基本目标是在这些1080三元组上进行PCA.为了加快速度,我想使用doParallel包.所以这里是缩短的片段,直到发生错误:
list <- foreach(i=1:ncol(combs)) %dopar% {
tmp_triple <- combs[,i]
p1<-data[tmp_triple[[1]]][[1]]
p2<-data[tmp_triple[[2]]][[1]]
p3<-data[tmp_triple[[3]]][[1]]
data.merge <- merge(p1,p2,p3,all=FALSE)
}
Run Code Online (Sandbox Code Playgroud)
这里,合并功能似乎是问题所在.错误是
任务1失败 - "无法将类c("xts","zoo")强制转换为data.frame"
但是,当将%dopar%更改为正常序列%do%时,一切都可以接受.
直到现在我无法找到任何解决这个问题的方法,我甚至不确定要寻找什么.
我正在尝试使用Postgresql上字段中的单词计数来更新一个大表(大约1M行).此查询有效,并设置token_count计算表中单词(标记)longtext的字段my_table:
UPDATE my_table mt SET token_count =
(select count(token) from
(select unnest(regexp_matches(t.longtext, E'\\w+','g')) as token
from my_table as t where mt.myid = t.myid)
as tokens);
Run Code Online (Sandbox Code Playgroud)
myid是表的主键.
\\w+是必要的,因为我想数字,忽略特殊字符.例如,A test . ; )将返回5,基于空格的计数,而2是正确的值.问题是它非常慢,2天不足以在1M行上完成它.你会做些什么来优化它?有没有办法避免加入?
如何使用例如limit和批处理将批处理拆分为块offset?
谢谢你的提示,
Mulone
更新:我测量了array_split的性能,无论如何更新都会很慢.因此,解决方案可能包括并行化.如果我运行不同的查询psql,只有一个查询有效,其他查询等待它完成.如何并行更新?
我正在尝试使用bash函数来执行多个Web抓取(使用curl等),我想让它们全部在后台执行,并且所有打印输出到stdin.这怎么可能?