有没有办法_mm_slli_si128
在AVX2中重建指令以将__mm256i
寄存器移位x个字节?
的_mm256_slli_si256
似乎只是执行两个_mm_slli_si128
上的[127:0]和A [255:128].
左移应该__m256i
是这样的:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, ..., 32] -> [2, 3, 4, 5, 6, 7, 8, 9, ..., 0]
Run Code Online (Sandbox Code Playgroud)
我在线程中看到可以创建一个_mm256_permutevar8x32_ps
32位的移位.但我需要一个更通用的解决方案来换班x字节.有人已经解决了这个问题吗?
我正在尝试使用SSE4 dot产品改进此代码,但我很难找到解决方案.此函数获取参数qi和tj,其中包含每个80个单元格的浮点数组,然后计算点积.返回值是具有四个点积的向量.所以我想要做的就是并行计算20个值的四个点积.
您知道如何改进此代码吗?
inline __m128 ScalarProd20Vec(__m128* qi, __m128* tj)
{
__m128 res=_mm_add_ps(_mm_mul_ps(tj[0],qi[0]),_mm_mul_ps(tj[1],qi[1]));
res=_mm_add_ps(res,_mm_add_ps(_mm_mul_ps(tj[2],qi[2]),_mm_mul_ps(tj[3],qi[3])));
res=_mm_add_ps(res,_mm_add_ps(_mm_mul_ps(tj[4],qi[4]),_mm_mul_ps(tj[5],qi[5])));
res=_mm_add_ps(res,_mm_add_ps(_mm_mul_ps(tj[6],qi[6]),_mm_mul_ps(tj[7],qi[7])));
res=_mm_add_ps(res,_mm_add_ps(_mm_mul_ps(tj[8],qi[8]),_mm_mul_ps(tj[9],qi[9])));
res=_mm_add_ps(res,_mm_add_ps(_mm_mul_ps(tj[10],qi[10]),_mm_mul_ps(tj[11],qi[11])));
res=_mm_add_ps(res,_mm_add_ps(_mm_mul_ps(tj[12],qi[12]),_mm_mul_ps(tj[13],qi[13])));
res=_mm_add_ps(res,_mm_add_ps(_mm_mul_ps(tj[14],qi[14]),_mm_mul_ps(tj[15],qi[15])));
res=_mm_add_ps(res,_mm_add_ps(_mm_mul_ps(tj[16],qi[16]),_mm_mul_ps(tj[17],qi[17])));
res=_mm_add_ps(res,_mm_add_ps(_mm_mul_ps(tj[18],qi[18]),_mm_mul_ps(tj[19],qi[19])));
return res;
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用来自axis2(版本1.6.1)的wsdl2java生成一个Web服务客户端.
./wsdl2java.sh -uri http://www.ncbi.nlm.nih.gov/entrez/eutils/soap/v2.0/efetch_snp.wsdl
Run Code Online (Sandbox Code Playgroud)
当我打电话给这项服务时,我得到一个例外.
org.apache.axis2.AxisFault: org.apache.axis2.databinding.ADBException: Unexpected subelement {http://www.ncbi.nlm.nih.gov/soap/eutils/efetch_snp}Rs
try {
EFetchSnpServiceStub fetchService = new EFetchSnpServiceStub();
EFetchSnpServiceStub.EFetchRequest reqIdSnp = new EFetchSnpServiceStub.EFetchRequest();
reqIdSnp.setId("193925233");
EFetchSnpServiceStub.EFetchResult resIdSnp = fetchService.run_eFetch(reqIdSnp);
} catch (Exception e) {
System.out.println(e.toString());
}
Run Code Online (Sandbox Code Playgroud)
但是,使用soaptest,我可以在结果中看到Rs Tag.
<Rs rsId="193925233" snpClass="snp" snpType="notwithdrawn" molType="genomic" bitField="050000000005000000000100" taxId="3702">
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个异常?WSDL不在我的控制之下.
我在ResultSetExtractor中调用getInt时遇到了性能问题.GetInt被称为20000次.一次通话费用为0.15毫秒,总体成本为24秒,同时在探查器内部运行.执行SQL语句大约需要8秒钟(通过Primary-Key访问).我使用mysql驱动程序版本5.1.13,mysql服务器5.1.44和spring-jdbc-3.1.1你有想法提高性能吗?
mut.getMutEffect()[0]=(rs.getInt("leffect_a") != 0);
mut.getMutEffect()[1]=(rs.getInt("leffect_c") != 0);
...
mut.getMutEffect()[19]=(rs.getInt("leffect_y") != 0);
mut.getMutReliability()[0]=rs.getInt("lreliability_a");
...
mut.getMutReliability()[19]=rs.getInt("lreliability_y");
Run Code Online (Sandbox Code Playgroud)
我的计划看起来像这样
CREATE TABLE mutation (
...
leffect_a BIT NOT NULL,
lreliability_a TINYINT UNSIGNED NOT NULL,
...
leffect_y BIT NOT NULL,
lreliability_y TINYINT UNSIGNED NOT NULL,
...
) ENGINE=MyISAM;
Run Code Online (Sandbox Code Playgroud)
编辑:在getInt中调用methode getIntWithOverflowCheck,这看起来很昂贵.是否有可能完成这项检查?
我试图以有效的方式从128位寄存器中提取4个字节.问题是每个值都是32位{120,0,0,0,55,0,0,0,42,0,0,0,120,0,0,0}
.我想将128位转换为32位形式{120,55,42,120}
.
"原始"代码如下所示:
__m128i byte_result_vec={120,0,0,0,55,0,0,0,42,0,0,0,120,0,0,0};
unsigned char * byte_result_array=(unsigned char*)&byte_result_vec;
result_array[x]=byte_result_array[0];
result_array[x+1]=byte_result_array[4];
result_array[x+2]=byte_result_array[8];
result_array[x+3]=byte_result_array[12];
Run Code Online (Sandbox Code Playgroud)
我的SSSE3代码是:
unsigned int * byte_result_array=...;
__m128i byte_result_vec={120,0,0,0,55,0,0,0,42,0,0,0,120,0,0,0};
const __m128i eight_bit_shuffle_mask=_mm_set_epi8(1,1,1,1,1,1,1,1,1,1,1,1,0,4,8,12);
byte_result_vec=_mm_shuffle_epi8(byte_result_vec,eight_bit_shuffle_mask);
unsigned int * byte_result_array=(unsigned int*)&byte_result_vec;
result_array[x]=byte_result_array[0];
Run Code Online (Sandbox Code Playgroud)
我怎样才能有效地使用SSE2.SSSE3或SSE4有更好的版本吗?
我写了一个函数,它将两个大文件(file1,file2
)合并到一个新文件(outputFile
)中.每个文件都是基于行的格式,而条目以\ 0字节分隔.两个文件都具有相同数量的空字节.
一个包含两个条目的示例文件可能如下所示 A\nB\n\0C\nZ\nB\n\0
Input:
file1: A\nB\0C\nZ\nB\n\0
file2: BBA\nAB\0T\nASDF\nQ\n\0
Output
outputFile: A\nB\nBBA\nAB\0C\nZ\nB\nT\nASDF\nQ\n\0
FILE * outputFile = fopen(...);
setvbuf ( outputFile , NULL , _IOFBF , 1024*1024*1024 )
FILE * file1 = fopen(...);
FILE * file2 = fopen(...);
int c1, c2;
while((c1=fgetc(file1)) != EOF) {
if(c1 == '\0'){
while((c2=fgetc(file2)) != EOF && c2 != '\0') {
fwrite(&c2, sizeof(char), 1, outputFile);
}
char nullByte = '\0';
fwrite(&nullByte, sizeof(char), 1, outputFile);
}else{
fwrite(&c1, sizeof(char), 1, outputFile);
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法提高这个功能的IO性能?我 …
我在JDK 1.6 http服务器上创建了一个基于jersey 1.12的宁静服务外观.当我在eclipse中启动我的应用程序时,一切正常.我可以毫无困难地与外观进行通信,但是当我使用启动脚本通过控制台启动应用程序时,我在访问服务时遇到了IncompatibleClassChangeError.
我能够缩小问题的范围.问题在于发送响应.因为我可以正常地与服务通信(请求被处理)但我没有得到回复.你对此有什么线索吗?
启动脚本
#!/usr/bin/env bash
libpath=
for i in $(ls lib/*|grep ".jar"); do
libpath=$( echo "$i:$libpath");
done
java -cp "$(echo $libpath)build/jar/myjar.jar" org.....Startup
Run Code Online (Sandbox Code Playgroud)
将被抛出的异常
WARNUNG: Class org....facade.ServiceFacadeImpl is ignored as an instance is registered in the set of singletons
Call getMutationList: NP_005378
Exception in thread "pool-1-thread-1" java.lang.IncompatibleClassChangeError: Class javax.ws.rs.core.Response$Status does not implement the requested interface javax.ws.rs.core.Response$StatusType
Run Code Online (Sandbox Code Playgroud)
我的门面的一部分
@GET
@Path("/mutations/{id}/{from}/{size}")
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public MutationPosContainer getMutationList(@PathParam("id") String id,
@PathParam("from") Integer from, @PathParam("size") Integer size) {
...
if (posContainer …
Run Code Online (Sandbox Code Playgroud) 我尝试从__m256i寄存器中提取64位.我当前提取功能的示例:
byte 31 16 15 0
byte_result_vec 000D 000C 000B 000A 000H 000G 000F 000E
_mm256_packs_epi32 -> 0D0C 0B0A 0D0C 0B0A 0H0G 0F0E 0H0G 0F0E
_mm256_packus_epi16 -> DCBA DCBA DCBA DCBA HGFE HGFE HGFE HGFE
^^^^ ^^^^
_mm256_castsi256_si128 -> HGFE HGFE HGFE HGFE
_mm256_extracti128_si256 -> DCBA DCBA DCBA DCBA
_mm_cvtsi128_si32(byte_result_vec1) -> ABCD
_mm_cvtsi128_si32(byte_result_vec2) -> EFGH
Run Code Online (Sandbox Code Playgroud)
下面的代码将4x8位移到寄存器位置0-3,而不是提取32位.
byte_result_vec = _mm256_packs_epi32(byte_result_vec, byte_result_vec);
byte_result_vec = _mm256_packus_epi16(byte_result_vec, byte_result_vec);
__m128i byte_result_vec1 = _mm256_castsi256_si128(byte_result_vec);
__m128i byte_result_vec2 = _mm256_extracti128_si256(byte_result_vec,1);
const int res1 = _mm_cvtsi128_si32(byte_result_vec1);
const int res2 …
Run Code Online (Sandbox Code Playgroud) 我试图将一些代码从FANN Lib(用C语言编写的神经网络)移植到SSE2.但是SSE2的性能比普通代码差.使用我的SSE2实现运行一次运行需要5.50分钟而不需要5.20分钟.
SSE2怎么能比正常运行慢?可能是因为_mm_set_ps
?我使用Apple LLVM编译器(XCode 4)编译代码(所有SSE扩展标志都打开,优化级别为-Os
).
没有SSE2的代码
neuron_sum +=
fann_mult(weights[i], neurons[i].value) +
fann_mult(weights[i + 1], neurons[i + 1].value) +
fann_mult(weights[i + 2], neurons[i + 2].value) +
fann_mult(weights[i + 3], neurons[i + 3].value);
Run Code Online (Sandbox Code Playgroud)
SSE2代码
__m128 a_line=_mm_loadu_ps(&weights[i]);
__m128 b_line=_mm_set_ps(neurons[i+3].value,neurons[i+2].value,neurons[i+1].value,neurons[i].value);
__m128 c_line=_mm_mul_ps(a_line, b_line);
neuron_sum+=c_line[0]+c_line[1]+c_line[2]+c_line[3];
Run Code Online (Sandbox Code Playgroud) 我尝试使用gcc版本4.9.0 20131201在Mac OS 10.9上编译虚拟AVX2程序
//dummy program
#include <immintrin.h> // AVX2
#include <stdio.h>
int main(int argc, char* argv[]) {
__m256i reg = _mm256_set1_epi8(1);
__m256i result = _mm256_max_epu8(reg,reg);
printf("%d",((int *)&result)[0]);
}
Run Code Online (Sandbox Code Playgroud)
我用这个命令编译
gcc -mavx -O0 test.C
我收到这个错误
In function 'int main(int, char**)':
avx2intrin.h:373:1:
error: inlining failed in call to always_inline
'__m256i _mm256_max_epu8(__m256i, __m256i)': target specific option mismatch
_mm256_max_epu8 (__m256i __A, __m256i __B)
Run Code Online (Sandbox Code Playgroud)
_mm256_max_epu8使用always_inline属性.这是问题吗?
如果我用O3编译,我也会遇到问题.
我究竟做错了什么?
我有一个__m128i寄存器(向量A),其内容为16位值:
{100,26,26,26,26,26,26,100} // A Vector
Run Code Online (Sandbox Code Playgroud)
现在我减去矢量
{82,82,82,82,82,82,82,82}
Run Code Online (Sandbox Code Playgroud)
随着指示
_mm_sub_epi16(a_vec,_mm_set1_epi16(82))
Run Code Online (Sandbox Code Playgroud)
预期结果应为以下向量
{18,-56,-56,-56,-56,-56,-56,18}
Run Code Online (Sandbox Code Playgroud)
但我明白了
{18,65480,65480,65480,65480,65480,65480,18}
Run Code Online (Sandbox Code Playgroud)
如何解决向量被视为已签名?
A Vector由此指令创建:
__m128i a_vec = _mm_srli_epi16(_mm_unpacklo_epi8(score_vec_8bit, score_vec_8bit), 8)
Run Code Online (Sandbox Code Playgroud)