我有一个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*"的参数不兼容
我正在编写一个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
这个问题不是关于"我如何按位排列"我们现在如何做到这一点,我们正在寻找的是一种更快的方式,更少的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.
解
在测试并使用给定的答案后,我们通过以下方式完成:
我有两个文件,每个文件有两列
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脚本的新手.请帮帮我.我的需求非常糟糕.
c ×2
algorithm ×1
bit-shift ×1
command-line ×1
cuda ×1
inputstream ×1
java ×1
permutation ×1
scripting ×1
shell ×1