小编Mys*_*ial的帖子

不平衡嵌套formp中的循环

我一直在尝试使用OpenMP并行化不平衡嵌套for循环的算法.我不能发布原始代码,因为这是一个闻所未闻的政府的秘密项目,但这是一个玩具示例:

for (i = 0; i < 100; i++) {
    #pragma omp parallel for private(j, k)
    for (j = 0; j < 1000000; j++) {
        for (k = 0; k < 2; k++) {
            temp = i * j * k;      /* dummy operation (don't mind the race) */
        }
        if (i % 2 == 0) temp = 0;  /* so I can't use openmp collapse */
    }
}
Run Code Online (Sandbox Code Playgroud)

目前这个实例在多个线程的工作速度较慢(〜1秒在单个线程〜2.4秒在2个线程等).

注意事项:

  • 外循环需要按顺序完成(取决于前一步)(据我所知,OpenMP处理好内部循环,因此在每一步都不会创建/销毁线程,对吗?)

  • 典型的索引号在示例中给出 (100, 1000000, 2) …

c parallel-processing multithreading openmp multiprocessing

1
推荐指数
1
解决办法
1008
查看次数

指针的const说明符

我可以声明,foo(const T& var)以便我知道var不会被改变.

指针的等效格式是foo(const T* var)

在过去,我想这些,相关的错误iterator/ const_iterator我恼火,我只是倾向于使用(T* var)不考虑常量性.

是否有一个很好的doc来声明函数,强制指针指向的内容不会改变'?

c++ pointers const

1
推荐指数
1
解决办法
335
查看次数

乘以两个浮点数并不能得到确切的结果

我试图将两个floats 乘以如下:

float number1 = 321.12;
float number2 = 345.34;
float rexsult = number1 * number2;
Run Code Online (Sandbox Code Playgroud)

我想看到的结果是110895.582,但是当我运行代码时它只给了我110896.大部分时间我都有这个问题.任何计算器都会给出包含所有小数的精确结果.我怎样才能获得这个结果?

编辑:这是C代码.我正在使用XCode iOS模拟器.

c floating-point

1
推荐指数
1
解决办法
1万
查看次数

将多个参数传递给_beginThreadEx

是否可以将多个参数传递给beginthreadex?

我知道我可以创建一个类或结构,但如果我有不相关的数据片段,我不想将它们组合成一个类或结构呢?

Boost库似乎允许多个参数,但我如何为标准c ++ _beginThreadEx执行多个参数?

#include <iostream>
#include <process.h>

unsigned __stdcall myThread(void *data)
{
    //C:\dev\default threads\_threads.cpp|6|error: invalid conversion from 'int*' to 'int' [-fpermissive]|
    int *x = static_cast<int*>(data);

    //int *x = (int*)data;

    std::cout << "Hello World! " << x;
}

int main()
{

    int x = 10;
    _beginthreadex(NULL, 0, myThread, &x, 0, NULL);
    while(true);
}
Run Code Online (Sandbox Code Playgroud)

c++ windows parameters multithreading beginthreadex

1
推荐指数
1
解决办法
3350
查看次数

rep_movsl的Clobber列表

我正在尝试使用内联汇编的示例:http://www.delorie.com/djgpp/doc/brennan/brennan_att_inline_djgpp.html 但是有些事让我感到困惑:

  • 关于clobber的行为
    Clobbering实质上告诉GCC不信任指定寄存器/存储器中的值.

    "好吧,当GCC能够确切地知道你之前和之后对寄存器做了什么时,这确实很有帮助......如果你告诉它将(x + 1)放入寄存器中,它甚至足够聪明. ,如果你没有破坏它,后来C代码引用(x + 1),并且它能够保持该寄存器空闲,它将重用计算.哇."

这一段是否意味着clobbering将禁用常见的子表达式消除?

  • 关于clobber列表的教程中存在一些不一致:
    对于输入/输出列表中指定的寄存器,不需要将它们放入clobber列表中,因为GCC知道; 但是在关于rep_movsl(或rep_stosl)的示例中:

    asm("cld \n\t""rep \n\t""stosl":/*无输出寄存器*/:"c"(计数),"a"(fill_value),"D"(dest):" %ecx","%edi");

虽然"S,D,c"在输出操作数中,但它们再次被列为破坏.我在C中尝试了一个简单的片段:

#include<stdio.h>
int main()
{
  int a[] = {2, 4, 6};
  int b[3];
  int n = 3;
  int v = 12;
  asm ("cld\n\t"
       "rep\n\t"
       "movsl"
       :
       : "S" (a), "D" (b), "c" (n)
       : );
//     : "%ecx", "%esi", "%edi" );
  printf("%d\n", b[1]);
}
Run Code Online (Sandbox Code Playgroud)

如果我使用评论的clobber列表,GCC会抱怨:

ac:8:3:错误:在重新加载'asm'ac时,无法在类'CREG'中找到寄存器:8:3:错误:'asm'操作数有不可能的约束

如果我使用空的clobber列表,它将编译并输出为4.

c x86 assembly gcc inline-assembly

1
推荐指数
1
解决办法
752
查看次数

在C中的16个char数组中连接32位int块

我有以下数据类型的结果缓冲区:

 char result[16];
Run Code Online (Sandbox Code Playgroud)

问题是,结果是以4个32位的块计算的,需要分配给128位结果char.

int res_tmp[0] = 0x6A09E667;
int res_tmp[1] = 0x6A09E612;
int res_tmp[2] = 0x6A09E432;
int res_tmp[3] = 0x6A09E123;
Run Code Online (Sandbox Code Playgroud)

理想情况下,应该有类似C中的连接运算符,例如,

result = res_tmp[0] || res_tmp[1] || res_tmp[2] || res_tmp[3];
Run Code Online (Sandbox Code Playgroud)

最后,结果需要通过套接字发送如下:

while((connection_fd = accept(socket_fd, 
                          (struct sockaddr *) &address,
                          &address_length)) > -1)
{
  n = write(connection_fd, result, strlen(result));
  if (n < 0) printf("Error writing to socket\n");            
  close(connection_fd);
  break;  
}
Run Code Online (Sandbox Code Playgroud)

任何人都知道在128-bir结果中连接32位字最简单的语法char

谢谢,帕特里克

c c++ arrays

1
推荐指数
1
解决办法
549
查看次数

Windows.h线程关联

下面的代码确实编译并运行,除了输出不是我期望的那样.我希望程序创建n个线程(取决于可用的多核数量)并运行在程序结束时找到的简单例程进行输出

"测试"

接下来是1-10.我得到的是一个输出,它写了一些数字,但它最多不超过两个,并且函数threadmain似乎不完全在一个线程上运行,但它有点输出测试:012在其他线程.我知道多线程会破坏输出,但我应该在屏幕的某处看到数字3,4,5,6,7,8,9,但它没有显示出来.

#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <stdio.h>
#include <cmath>
#include <iostream>

HANDLE *m_threads = NULL;
static DWORD_PTR WINAPI threadMain(void* p);

DWORD_PTR GetNumCPUs()
{
  SYSTEM_INFO m_si = {0, };
  GetSystemInfo(&m_si);
  return (DWORD_PTR)m_si.dwNumberOfProcessors;
}

CRITICAL_SECTION g_crit_sec;
static int g_start = 0;

int main(int argc, char **args)
{
  DWORD_PTR c = GetNumCPUs();

  m_threads = new HANDLE[c];

  InitializeCriticalSectionAndSpinCount(&g_crit_sec, 0x80000400);

  for(DWORD_PTR i = 0; i < c; i++)
  {
    DWORD_PTR m_id = 0;
    DWORD_PTR m_mask = 1 << i;

    m_threads[i] = CreateThread(NULL, 0, …
Run Code Online (Sandbox Code Playgroud)

c++ windows multithreading setthreadaffinitymask

1
推荐指数
1
解决办法
1277
查看次数

用于乘法的背包算法

我有一组N数字,每个数字附加一些费用,问题是选择所有可能的数字组作为列表,使其产品小于一定数量M,根据成本总和进行排序.

例如: - 这组数字是

(number, costOfThatNumber) : {(90, 10) , (80, 20), (60, 40), (40, 60), (15, 85)},
Run Code Online (Sandbox Code Playgroud)

并且产品必须小于Prod <= 1000,

可能的解决方案是: -

[Solution 1 :- {(15, 85), (40, 60)} :- Product = 600 (which is less than, 1000), cost = 85 + 60 = 145]
[Solution 2 :- {(15, 85), (80, 20)} :- Product = 900 and cost = 105]
Run Code Online (Sandbox Code Playgroud)

所以列表变成,{Solution2, Solution1}.

PS: -

  1. 这不是一个家庭作业问题,在接受采访时被问到.我只被问到算法,我只能说它看起来有点像背包问题,但是用于乘法.
  2. 如果我无法正确解释问题,请原谅.

algorithm knapsack-problem

0
推荐指数
1
解决办法
691
查看次数

程序因递归而减慢

我正在尝试编写一个程序,将我的C:驱动器上的每个文件和文件夹名称添加到ArrayList.代码工作正常,但由于大量的递归,它变得非常缓慢.这是代码:

public static void updateFileDataBase()
{
    ArrayList<String> currentFiles = new ArrayList<String>();
    addEverythingUnder("C:/",currentFiles,new String[]{"SteamApps","AppData"});
    for(String name : currentFiles)
        System.out.println(name);
}
private static void addEverythingUnder(String path, ArrayList<String> list, String[] exceptions)
{
    System.gc();
    System.out.println("searching " + path);
    File search = new File(path);
    try
    {
        for(int i = 0; i < search.list().length; i++)
        {
            boolean include = true;
            for(String exception : exceptions)
                if(search.list()[i].contains(exception))
                    include = false;
            if(include)
            {
                list.add(search.list()[i]);
                if(new File(path + "/" + search.list()[i]).isDirectory())
                {
                    addEverythingUnder(path + "/" + search.list()[i],list,exceptions);
                }
            }
        } …
Run Code Online (Sandbox Code Playgroud)

java recursion performance

0
推荐指数
2
解决办法
197
查看次数

使用临时变量是否存在性能问题?

我有一个关于在java中创建新对象的问题.

让我们说我有方法叫: foo(String[] a)

我想传递给foo一个新String[]的只有一个用途的东西更好

表现1或2

1.

String[] a = new String[]{"a"};

foo(a);
Run Code Online (Sandbox Code Playgroud)

2.

foo(new String[]{"a"});
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助

java performance

0
推荐指数
1
解决办法
153
查看次数