小编Tho*_*ger的帖子

如何从CUDA内核函数返回单个变量?

我有一个CUDA搜索功能,可以计算一个变量.我怎么能把它还给我.

__global__ 
void G_SearchByNameID(node* Node, long nodeCount, long start,char* dest, long answer){
    answer = 2;
}

cudaMemcpy(h_answer, d_answer, sizeof(long), cudaMemcpyDeviceToHost);
cudaFree(d_answer);
Run Code Online (Sandbox Code Playgroud)

对于这两行我得到这个错误:错误:类型"long"的参数与类型"const void*"的参数不兼容

c cuda

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

无法使用Apache Commons Exec为命令提供多个输入并提取输出

我正在编写一个Java应用程序,需要使用Apache Commons Exec库来使用外部命令行应用程序.我需要运行的应用程序具有相当长的加载时间,因此最好保持一个实例处于活动状态而不是每次都创建一个新进程.应用程序的工作方式非常简单.一旦启动,它会等待一些新输入并生成一些数据作为输出,这两个数据都使用应用程序的标准I/O.

因此,我们的想法是执行CommandLine,然后将PumpStreamHandler与三个独立的流(输出,错误和输入)一起使用,并使用这些流与应用程序进行交互.到目前为止,我已经在基本场景中完成了这项工作,我有一个输入,一个输出,然后应用程序关闭.但是一旦我试图进行第二次交易,就会出现问题.

在创建了我的CommandLine之后,我创建了我的Executor并像这样启动它:

this.executor = new DefaultExecutor();

PipedOutputStream stdout = new PipedOutputStream();
PipedOutputStream stderr = new PipedOutputStream();
PipedInputStream stdin = new PipedInputStream();
PumpStreamHandler streamHandler = new PumpStreamHandler(stdout, stderr, stdin);

this.executor.setStreamHandler(streamHandler);

this.processOutput = new BufferedInputStream(new PipedInputStream(stdout));
this.processError = new BufferedInputStream(new PipedInputStream(stderr));
this.processInput = new BufferedOutputStream(new PipedOutputStream(stdin));

this.resultHandler = new DefaultExecuteResultHandler();
this.executor.execute(cmdLine, resultHandler);
Run Code Online (Sandbox Code Playgroud)

然后我继续启动三个不同的线程,每个线程处理一个不同的流.我还有三个处理输入和输出的SynchronousQueues(一个用作输入流的输入,一个用于通知outputQueue已启动新命令而另一个用于输出).例如,输入流线程如下所示:

while (!killThreads) {
    String input = inputQueue.take();

    processInput.write(input.getBytes());
    processInput.flush();

    IOQueue.put(input);
}
Run Code Online (Sandbox Code Playgroud)

如果我删除while循环并执行一次,一切似乎都完美无缺.显然,如果我再次尝试执行它,PumpStreamHandler会抛出异常,因为它已被两个不同的线程访问.

这里的问题是,在线程结束之前,似乎没有真正刷新processInput.调试时,命令行应用程序仅在线程结束时才真正接收其输入,但如果保留while循环则永远不会获得它.我已经尝试了许多不同的东西来使processInput刷新,但似乎没有任何工作.

以前有人尝试过类似的东西吗?有什么我想念的吗?任何帮助将不胜感激!

java command-line multithreading inputstream apache-commons-exec

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

并行/组合的多个64位值的按位置换

这个问题不是关于"我如何按位排列"我们现在如何做到这一点,我们正在寻找的是一种更快的方式,更少的CPU指令,受到DES中sbox的bitlice实现的启发

为了加快一些密码,我们希望减少排列调用的数量.主要密码函数基于查找数组执行多个按位排列.由于置换操作只是位移,

我们的基本思想是采用需要相同排列的多个输入值,并将它们并行移位.例如,如果必须将输入位1移动到输出位6.

有没有办法做到这一点?我们现在没有示例代码,因为绝对不知道如何以高效的方式实现这一目标.

我们平台上的最大值大小为128位,最长输入值为64位.因此代码必须更快,然后进行128次整个排列.

编辑

这是一个简单的8位排列示例

+---+---+---+---+---+---+---+---+
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | <= Bits
+---+---+---+---+---+---+---+---+
+---+---+---+---+---+---+---+---+
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | <= Input
+---+---+---+---+---+---+---+---+
| 3 | 8 | 6 | 2 | 5 | 1 | 4 | 7 | <= Output
+---+---+---+---+---+---+---+---+
Run Code Online (Sandbox Code Playgroud)

密码使用多个输入密钥.它是块密码,因此必须将相同的模式应用于输入的所有64位块.

由于每个输入块的排列相同,我们希望在一个步骤中处理多个输入块/组合多个输入序列的操作.而不是每次呼叫移动128次一位,一次移动1次128位.

EDIT2

我们不能使用线程,因为我们必须在没有线程支持的情况下在嵌入式系统上运行代码.因此,我们也无法访问外部库,我们必须保持简单C.

在测试并使用给定的答案后,我们通过以下方式完成:

  • 我们将128位64位值的单位放在uint128_t [64]*数组上.
  • 对于排列,我们只需要复制指针 …

c algorithm parallel-processing permutation bit-shift

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

需要Shell脚本才能根据第一列找到两个文件的差异

我有两个文件,每个文件有两列

File1 列数低于:

ECDLT 5  
DBG0  0  
AHDST 53  
RSNDL 10  
DBLOG 2  
ATDLM 1  
ATREJ 1  
DLMKT 0   
AKDRP -100  
ALTCM 100000000    
BCPTM -1000000000   
PERFS 1  
OMSTD 1  
LDTHD 1  
DGCAN 1  
HRLOG 1  
AKALT 0  
Run Code Online (Sandbox Code Playgroud)

File2 列数低于:

ECDLT 5  
DBG0  0  
MFLOR 1  
LIPEM 1  
GXTHR 5  
LIPEM 1  
LIPEM 1  
RPTAT -1  
RPTPA -1  
PTIMR 1  
NOQUE 1  
AHDST 53  
RSNDL 10  
DBLOG 2  
Run Code Online (Sandbox Code Playgroud)

所以,在这里我需要一个shell脚本来查找使用第一列的两个文件的差异,在输出中它应该打印两列.

我是shell脚本的新手.请帮帮我.我的需求非常糟糕.

shell scripting

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