小编Aea*_*ean的帖子

如何终止std :: future?

我对C++ 11的一些事情感到困惑std::future.我想动态平衡工作负载,所以如果有一些处理器空闲,我创建一个std::futurewith std::async来划分剩余的数据.它工作正常.

std::future<int> f[MAX_CHILD];
for ( each data item ){
    if ( found_idle_processor )
        f[i] = std::async( ... );

    process();
}

// At last, query the result of f.
for ( each future )
    hold = f[i].get();
Run Code Online (Sandbox Code Playgroud)

但有时,一旦找到一些特殊数据项,所有其他数据将被丢弃,程序应立即给出最终结果,然后将启动另一个任务.

std::future<int> f[MAX_CHILD];
for ( each data item ){
    if ( found_idle_processor )
        f[i] = std::async( ... );

    process();

    if ( found_special_item )
        return final_result;
}
// At last, query the result of each f.
for ( …
Run Code Online (Sandbox Code Playgroud)

c++ c++11

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

什么是"虚假分享"?如何重现/避免它?

今天我和我的教授在并行编程课上有了不同的理解,关于什么是"虚假共享".我的教授所说的没什么意义,所以我立即指出了.她认为"虚假分享"会导致程序结果出错.

我说,"错误共享"发生在将不同的内存地址分配给同一个缓存行时,将数据写入其中一个会导致另一个被踢出缓存.如果处理器在两个错误共享地址之间写入转向和转向,则它们都不能停留在高速缓存上,因此所有操作都将导致DRAM的访问.

到目前为止,这是我的意见.事实上,我不确定我说的是什么......如果我有误解,请指出.

所以有一些问题.假设缓存为64字节对齐,4路组关联.

  1. 是否有可能两个超过64字节的地址是"错误共享"?
  2. 单线程程序是否可能遇到"错误共享"问题?
  3. 重现"虚假共享"的最佳代码示例是什么?
  4. 一般来说,应该注意什么以避免程序员的"错误共享"?

parallel-processing optimization caching computer-architecture false-sharing

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

为什么程序(全局)范围变量必须是__constant?

我是OpenCL的新手,并且对此限制感到困惑.例如,如果我想写一个LCG,我必须使状态字可以修改为rand()srand().在ANSI C中,我将使用以下内容执行此操作:

/* ANSI C */
static unsigned long _holdrand = 1; /* Global! */

unsigned long rand(){
    _holdrand = _holdrand * 214013L + 2531011L;
    return (_holdrand >> 16) & 0x7FFF; 
}
void srand( unsigned long seed ){
    _holdrand = seed;
}
Run Code Online (Sandbox Code Playgroud)

但OpenCL限制所有全局范围变量__constant.我可以_holdrand进入函数范围,并将其指针退出该函数.

/* OpenCL C */
uint* holdrand(){
    __private static uint _holdrand = 1;
    return &_holdrand;
}

uint rand(){
    *holdrand() = *holdrand() * 214013L + 2531011L;
    return (*holdrand() >> 16) & …
Run Code Online (Sandbox Code Playgroud)

global-variables opencl

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