我一直在尝试使用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) …
我可以声明,foo(const T& var)以便我知道var不会被改变.
指针的等效格式是foo(const T* var)?
在过去,我想这些,相关的错误iterator/ const_iterator我恼火,我只是倾向于使用(T* var)不考虑常量性.
是否有一个很好的doc来声明函数,强制指针指向的内容不会改变'?
我试图将两个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模拟器.
是否可以将多个参数传递给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) 我正在尝试使用内联汇编的示例:http://www.delorie.com/djgpp/doc/brennan/brennan_att_inline_djgpp.html 但是有些事让我感到困惑:
"好吧,当GCC能够确切地知道你之前和之后对寄存器做了什么时,这确实很有帮助......如果你告诉它将(x + 1)放入寄存器中,它甚至足够聪明. ,如果你没有破坏它,后来C代码引用(x + 1),并且它能够保持该寄存器空闲,它将重用计算.哇."
关于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.
我有以下数据类型的结果缓冲区:
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?
谢谢,帕特里克
下面的代码确实编译并运行,除了输出不是我期望的那样.我希望程序创建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) 我有一组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: -
我正在尝试编写一个程序,将我的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中创建新对象的问题.
让我们说我有方法叫: 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)
谢谢你的帮助