適用于ATI卡的GPU計算MD5的小程序源碼,基于AMD APP SDK開發

以下代碼在win7 home basic , ati hd 5450平臺測試通過,處理速度為每秒100萬次。

?

程序很簡單,只有一個main.cpp程序。Device端只有一個md5.cl文件。

下面我把代碼貼出來,因為不能上傳附件,我把完整工程包放到了242337476的群共享里面。。。。

?

main.cpp

復制代碼
#include "CL\cl.h"#include <stdio.h>
#include <iostream>#include <Windows.h>void main()
{cl_int err_code;printf("\nLet's rock!!!!!\n");//setup platformcl_platform_id platIDs[128];cl_uint numPlatform;if( clGetPlatformIDs(128, platIDs, &numPlatform) != CL_SUCCESS ){printf("error: clGetPlatformIDs\n");return;}printf("number platforms we found :%d\n", numPlatform);for(int i=0; i<numPlatform; i++){char buf[500];size_t s;if(clGetPlatformInfo(platIDs[i],CL_PLATFORM_NAME, 500, buf, &s) != CL_SUCCESS){printf("error: clGetPlatformInfo\n");return;}printf("%d:%s\n", i, buf);}//get device infocl_device_id deviceIDs[128];cl_uint numDevice;if(clGetDeviceIDs(platIDs[0], CL_DEVICE_TYPE_GPU, 128, deviceIDs, &numDevice) != CL_SUCCESS){printf("error: clGetDeviceIDs\n");return;}printf("number device we found :%d\n", numDevice);for(int i=0; i<numDevice; i++){char buf[500]; size_t s;if(clGetDeviceInfo(deviceIDs[i], CL_DEVICE_NAME, 500, buf, &s) != CL_SUCCESS){printf("error: clGetDeviceInfo\n");return;}printf("Device %d, %s\n", deviceIDs[i], buf);}//user platform 0////create context
cl_context theContext;cl_context_properties cps[3] = { CL_CONTEXT_PLATFORM, (cl_context_properties)platIDs[0], 0 };theContext = clCreateContext(cps, 1, deviceIDs, NULL, NULL, &err_code);if(err_code != CL_SUCCESS){printf("error: clCreateContext\n");return;}//command queue
    cl_command_queue commandQ;commandQ = clCreateCommandQueue(theContext, deviceIDs[0], 0, &err_code);if(err_code != CL_SUCCESS){printf("error: clCreateCommandQueue\n");return;}//program//read from file to bufFILE *fp;fp = fopen("md5.cl", "rb");static char source[1024*1024];//1MByte to big to the default stacksize_t numRead = fread(source, 1, 1024*1024, fp);printf("read %d bytes from md5.cl\n", numRead);fclose(fp);//create program 
    cl_program Prog;char* srcarr[1];srcarr[0] = source;size_t srclen[1];srclen[0] = numRead;Prog = clCreateProgramWithSource(theContext, 1, (const char **)srcarr, srclen, &err_code);if(err_code != CL_SUCCESS){printf("error: clCreateProgramWithSource\n");return;}//build programif(clBuildProgram(Prog, 1, deviceIDs, "", NULL, NULL) != CL_SUCCESS){// Shows the logchar* build_log;size_t log_size;// First call to know the proper sizeclGetProgramBuildInfo(Prog, deviceIDs[0], CL_PROGRAM_BUILD_LOG, 0, NULL, &log_size);build_log = new char[log_size+1];// Second call to get the logclGetProgramBuildInfo(Prog, deviceIDs[0], CL_PROGRAM_BUILD_LOG, log_size, build_log, NULL);build_log[log_size] = '\0';printf("%s\n", build_log);delete[] build_log;printf("error: clBuildProgram\n");return;}//Create kernel
    cl_kernel K;K = clCreateKernel(Prog, "md5_kernel", &err_code);if(err_code != CL_SUCCESS){printf("error: clCreateKernel\n");return;}//alloc memory and set kernel paramcl_mem res_d = clCreateBuffer(theContext, CL_MEM_WRITE_ONLY, 1000*16, NULL, &err_code);if(err_code != CL_SUCCESS){printf("error: clCreateBuffer\n");return;}err_code = clSetKernelArg(K, 0, sizeof(cl_mem), &res_d);if(err_code != CL_SUCCESS){printf("error: clSetKernelArg\n");return;}const size_t global_ws = 1000;printf("Start\n");DWORD sTime = GetTickCount();for(int i=0; i<10000; i++){if(clEnqueueNDRangeKernel(commandQ, K, 1, NULL, &global_ws, 0, 0, NULL, NULL) != CL_SUCCESS){printf("error: clEnqueueNDRangeKernel\n");}clFinish(commandQ);printf("%d\r", i);}DWORD dTime = GetTickCount() - sTime;printf("\nFinished in %f second\n", dTime/1000.0f);//display resultchar* check = new char[1000*16];clEnqueueReadBuffer(commandQ, res_d, CL_TRUE, 0, 1000*16, check, 0, NULL, NULL);//*(check + 32) = '\0';//printf("Result is : %s\n", check);for(int j=0; j<10; j++){for (int i = 0; i < 16; i++){printf("%02x",(unsigned char)check[j*16 + i]);}printf("\n");}printf("\n");delete[] check;//release
    clReleaseKernel(K);clReleaseMemObject(res_d);clReleaseCommandQueue(commandQ);clReleaseProgram(Prog);clReleaseContext(theContext);}
復制代碼

?

?

md5.cl

復制代碼
// Enter your kernel in this window
/* MD5lib.h - md5 library*//* Copyright (C) 1990-2, RSA Data Security, Inc. Created 1990. All
rights reserved.RSA Data Security, Inc. makes no representations concerning either
the merchantability of this software or the suitability of this
software for any particular purpose. It is provided "as is"
without express or implied warranty of any kind.These notices must be retained in any copies of any part of this
documentation and/or software.*//* The following makes MD default to MD5 if it has not already beendefined with C compiler flags.*/#define MD 5/* GLOBAL.H - RSAREF types and constants*//* PROTOTYPES should be set to one if and only if the compiler supportsfunction argument prototyping.The following makes PROTOTYPES default to 0 if it has not alreadybeen defined with C compiler flags.*/
#ifndef PROTOTYPES
#define PROTOTYPES 0
#endif/* POINTER defines a generic pointer type */
typedef unsigned char *POINTER;/* UINT2 defines a two byte word */
typedef unsigned short UINT2;/* UINT4 defines a four byte word */
typedef unsigned int UINT4;/* PROTO_LIST is defined depending on how PROTOTYPES is defined above.
If using PROTOTYPES, then PROTO_LIST returns the list, otherwise itreturns an empty list.*/
#if PROTOTYPES
#define PROTO_LIST(list) list
#else
#define PROTO_LIST(list) ()
#endif/* Length of test block, number of test blocks.*/
#define TEST_BLOCK_LEN 1000
#define TEST_BLOCK_COUNT 1000/* Constants for MD5Transform routine.*/
#define S11 7
#define S12 12
#define S13 17
#define S14 22
#define S21 5
#define S22 9
#define S23 14
#define S24 20
#define S31 4
#define S32 11
#define S33 16
#define S34 23
#define S41 6
#define S42 10
#define S43 15
#define S44 21char* MDString PROTO_LIST ((char *));
char* MDFile PROTO_LIST ((char *));
char* hmac_md5(char* text, char* key);typedef struct {UINT4 state[4];                                   /* state (ABCD) */UINT4 count[2];        /* number of bits, modulo 2^64 (lsb first) */unsigned char buffer[64];                         /* input buffer */
} MD5_CTX;/*void MD5Init PROTO_LIST ((MD5_CTX *));
void MD5Update PROTO_LIST((MD5_CTX *, unsigned char *, unsigned int));
void MD5Final PROTO_LIST ((unsigned char [16], MD5_CT X *));void MD5Transform PROTO_LIST ((UINT4 [4], unsigned char [64]));
void Encode PROTO_LIST((unsigned char *, UINT4 *, unsigned int));
void Decode PROTO_LIST((UINT4 *, unsigned char *, unsigned int));
void MD5_memcpy PROTO_LIST ((POINTER, POINTER, unsigned int));
void MD5_memset PROTO_LIST ((POINTER, int, unsigned int));
*/
/*__global unsigned char PADDING[64] = {0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};*//* F, G, H and I are basic MD5 functions.*/
#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
#define H(x, y, z) ((x) ^ (y) ^ (z))
#define I(x, y, z) ((y) ^ ((x) | (~z)))/* ROTATE_LEFT rotates x left n bits.*/
#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
Rotation is separate from addition to prevent recomputation.*/
#define FF(a, b, c, d, x, s, ac) {(a)+=F((b), (c), (d)) + (x) + (UINT4)(ac);(a)= ROTATE_LEFT((a),(s)); (a)+=(b);}
#define GG(a, b, c, d, x, s, ac) {(a) += G ((b), (c), (d)) + (x) + (UINT4)(ac);(a) = ROTATE_LEFT ((a), (s)); (a) += (b);}
#define HH(a, b, c, d, x, s, ac) {(a) += H ((b), (c), (d)) + (x) + (UINT4)(ac);(a) = ROTATE_LEFT ((a), (s)); (a) += (b);}
#define II(a, b, c, d, x, s, ac) {(a) += I ((b), (c), (d)) + (x) + (UINT4)(ac);(a) = ROTATE_LEFT ((a), (s)); (a) += (b);}
void MD5Init (MD5_CTX *context);
void MD5Update(MD5_CTX *context, unsigned char *input,unsigned int inputLen);void MD5Final (unsigned char digest[16], MD5_CTX *context);
void MD5Transform  (UINT4 [4], unsigned char [64]) ;
void Encode(unsigned char *, UINT4 *, unsigned int);
void Decode (UINT4 *, unsigned char *, unsigned int);
void MD5_memcpy(POINTER, POINTER, unsigned int);
void MD5_memset(POINTER, int, unsigned int);/* MD5 initialization. Begins an MD5 operation, writing a new context.*/
void MD5Init (MD5_CTX *context)/* context */
{context->count[0] = context->count[1] = 0;/* Load magic initialization constants.
*/context->state[0] = 0x67452301;context->state[1] = 0xefcdab89;context->state[2] = 0x98badcfe;context->state[3] = 0x10325476;
}/* MD5 block update operation. Continues an MD5 message-digestoperation, processing another message block, and updating thecontext.*/
void MD5Update (MD5_CTX *context, unsigned char *input,unsigned int inputLen  )/* context *//* input block *//* length of input block */
{unsigned int i, index, partLen;/* Compute number of bytes mod 64 */index = (unsigned int)((context->count[0] >> 3) & 0x3F);/* Update number of bits */if ((context->count[0] += ((UINT4)inputLen << 3))< ((UINT4)inputLen << 3))context->count[1]++;context->count[1] += ((UINT4)inputLen >> 29);partLen = 64 - index;/* Transform as many times as possible.
*/if (inputLen >= partLen) {MD5_memcpy((POINTER)&context->buffer[index], (POINTER)input, partLen);MD5Transform (context->state, context->buffer);for (i = partLen; i + 63 < inputLen; i += 64)MD5Transform (context->state, &input[i]);index = 0;}elsei = 0;/* Buffer remaining input */MD5_memcpy((POINTER)&context->buffer[index], (POINTER)&input[i],inputLen-i);
}/* MD5 finalization. Ends an MD5 message-digest operation, writing thethe message digest and zeroizing the context.*/
void MD5Final (unsigned char digest[16], MD5_CTX *context)/* message digest *//* context */
{unsigned char bits[8];unsigned int index, padLen;/* Save number of bits */Encode (bits, context->count, 8);/* Pad out to 56 mod 64.
*/index = (unsigned int)((context->count[0] >> 3) & 0x3f);padLen = (index < 56) ? (56 - index) : (120 - index);unsigned char PADDING[64] = {0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};MD5Update (context,(unsigned char*) PADDING, padLen);/* Append length (before padding) */MD5Update (context, bits, 8);/* Store state in digest */Encode (digest, context->state, 16);/* Zeroize sensitive information.
*/MD5_memset ((POINTER)context, 0, sizeof (*context));
}/* MD5 basic transformation. Transforms state based on block.*/
static void MD5Transform (UINT4 state[4],
unsigned char block[64]){UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16];Decode (x, block, 64);/* Round 1 */FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 *//* Round 2 */GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */GG (d, a, b, c, x[10], S22,  0x2441453); /* 22 */GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 *//* Round 3 */HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */HH (b, c, d, a, x[ 6], S34,  0x4881d05); /* 44 */HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 *//* Round 4 */II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */state[0] += a;state[1] += b;state[2] += c;state[3] += d;/* Zeroize sensitive information.*/MD5_memset ((POINTER)x, 0, sizeof (x));
}/* Encodes input (UINT4) into output (unsigned char). Assumes len isa multiple of 4.*/
void Encode (unsigned char *output,
UINT4 *input,
unsigned int len){unsigned int i, j;for (i = 0, j = 0; j < len; i++, j += 4) {output[j] = (unsigned char)(input[i] & 0xff);output[j+1] = (unsigned char)((input[i] >> 8) & 0xff);output[j+2] = (unsigned char)((input[i] >> 16) & 0xff);output[j+3] = (unsigned char)((input[i] >> 24) & 0xff);}
}/* Decodes input (unsigned char) into output (UINT4). Assumes len isa multiple of 4.*/
void Decode (UINT4 *output,
unsigned char *input,
unsigned int len){unsigned int i, j;for (i = 0, j = 0; j < len; i++, j += 4)output[i] = ((UINT4)input[j]) | (((UINT4)input[j+1]) << 8) |(((UINT4)input[j+2]) << 16) | (((UINT4)input[j+3]) << 24);
}/* Note: Replace "for loop" with standard memcpy if possible.*/void MD5_memcpy (POINTER output,
POINTER input,
unsigned int len){unsigned int i;for (i = 0; i < len; i++)output[i] = input[i];
}/* Note: Replace "for loop" with standard memset if possible.*/
void MD5_memset (POINTER output,
int value,
unsigned int len){unsigned int i;for (i = 0; i < len; i++)((char *)output)[i] = (char)value;
}void myitoa(int i, char* string)
{int power, j;j=i; for (power=1;j>=10;j/=10) power*=10; for (;power>0;power/=10){*string++='0'+i/power; i%=power; }*string='\0';
}__kernel void md5_kernel (__global char* res)
{int idx = get_global_id(0);idx = idx%1000;char src[32];for(int i=0; i<32; i++){src[i] = 0;}myitoa(idx, src);int len;for(int i=0; i<32; i++){if(src[i] == 0){len = i;break;}}unsigned char digest[16];MD5_CTX context;MD5Init (&context);MD5Update (&context, (unsigned char*)src, len);MD5Final (digest, &context);for(int i=0; i<16; i++){*(res + idx*16 + i) = digest[i];}
}
復制代碼

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/448769.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/448769.shtml
英文地址,請注明出處:http://en.pswp.cn/news/448769.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【CentOS 7筆記11】,目錄權限,所有者與所有組,隱藏權限#171022

2019獨角獸企業重金招聘Python工程師標準>>> shallow丿ove 一. 文件或目錄權限change mode r4&#xff0c;w2&#xff0c;x1 selinux開啟則權限后面會有個. 更改SElinux配置文件&#xff0c;將永久關閉SElinux [rootlocalhost ~]# vi /etc/selinux/config #將默認…

python字符編碼與轉碼

詳細文章: http://www.cnblogs.com/yuanchenqi/articles/5956943.html http://www.diveintopython3.net/strings.html 需知: 1.在python2默認編碼是ASCII, python3里默認是unicode 2.unicode 分為 utf-32(占4個字節),utf-16(占兩個字節)&#xff0c;utf-8(占1-4個字節)&#xf…

IntelliJ IDEA 詳細圖解最常用的配置

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 剛剛使用IntelliJ IDEA 編輯器的時候&#xff0c;會有很多設置&#xff0c;會方便以后的開發&#xff0c;磨刀不誤砍柴工。 比如&#x…

OpenCL快速入門教程

OpenCL快速入門教程 原文地址&#xff1a;http://opencl.codeplex.com/wikipage?titleOpenCL%20Tutorials%20-%201 翻譯日期&#xff1a;2012年6月4日星期一 這是第一篇真正的OpenCL教程。這篇文章不會從GPU結構的技術概念和性能指標入手。我們將會從OpenCL的基礎API開始&…

Git使用教程-idea系列中git使用教程

一、新建項目 新建項目后記得復制git倉庫的地址。 二、上傳項目到git倉庫 在你的idea里新建git倉庫&#xff0c;這是新建本地倉庫&#xff0c;等會會同步到線上git倉庫 新建后如果代碼不是文件名不是綠色的表示沒有加入到git索引中 將需要上傳的文件按照下圖方式add 添加后&…

分布式開放 消息系統 (RocketMQ) 的原理與實踐

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 分布式消息系統作為實現分布式系統可擴展、可伸縮性的關鍵組件&#xff0c;需要具有高吞吐量、高可用等特點。而談到消息系統的設計&…

日本企業RPA導入風險分析和解決對策

日本企業RPA導入風險分析和解決對策 文/馬磊 【UiBot東京特約觀察 第三期】 RPA作為一種能將定型業務完全自動化的技術&#xff0c;在老齡化、少子化和勞動力不足的日本備受矚目。上一期我們談到了關于日本工作方式改革法案的實施以及RPA導入后帶來的積極影響。但是任何事物都會…

使用 OpenCL.Net 進行 C# GPU 并行編程

在 初探 C# GPU 通用計算技術 中&#xff0c;我使用 Accelerator 編寫了一個簡單的 GPU 計算程序。也簡單看了一些 Brahma 的代碼&#xff0c;從它的 SVN 最新代碼看&#xff0c;Brahma 要轉移到使用 OpenCL.Net 作為底層了&#xff0c;于是也去網上搜索了一下&#xff0c;發現…

模擬真實環境之內網漫游

0x00 前言 目標ip&#xff1a;192.168.31.55&#xff08;模擬外網&#xff09; 目的&#xff1a;通過一個站點滲透至內網&#xff0c;發現并控制內網全部主機 0x01 信息收集 用nmap進行端口探測 瀏覽站點時查看元素發現該站點是DotNetCMS v2.0 該版本cms存在SQL注入漏洞&#x…

iOS開發之普通網絡異步請求與文件下載方法

先來說說普通異步下載方法&#xff0c;分為POST、GET兩種 /** GET請求獲取數據*/(void)getDataWithUrl:(NSString *)strUrl finishBlock:(ECGNCNSDictionaryAndNSErrorBlock)finishBlock {if (strUrl.length 0) {return;}NSURL *url [NSURL URLWithString:strUrl];NSMutableU…

超簡單:解析 yml 類型(application.yml)配置文件 、springboot 工程讀取 yml 文件中的值

方法三是我覺得最簡單的。 前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. 工程結構&#xff1a; 2. 我要讀取 application.yml 中屬性 &#xff1a;spring.rocketmq.namesrvAddr …

初探 C# GPU 通用計算技術

GPU 的并行計算能力高于 CPU&#xff0c;所以最近也有很多利用 GPU 的項目出現在我們的視野中&#xff0c;在 InfoQ 上看到這篇介紹 Accelerator-V2 的文章&#xff0c;它是微軟研究院的研究項目&#xff0c;需要注冊后才能下載&#xff0c;感覺作為我接觸 GPU 通用運算的第一…

d3代碼如何改造成update結構(恰當處理enter和exit)

d3的enter和exit 網上有很多blog講解。說的還湊合的見&#xff1a;https://blog.csdn.net/nicolecc/article/details/50786661 如何把自己的rude繪圖代碼&#xff0c;進行精致化&#xff08;update&#xff09; 不多比比&#xff0c;上代碼示例&#xff1a; d3.selectAll(.circ…

退居二線VS在深圳發展,一個十年IT人的選擇之難

有的人一直以來&#xff0c;身體里彷佛住著兩個靈魂。一個靈魂說&#xff1a;人就要拼搏&#xff0c;要奮斗&#xff0c;要實現理想&#xff0c;要留在中國最繁華的城市&#xff0c;感受大都市的生活&#xff0c;實現個人價值&#xff0c;走上人生巔峰&#xff01;另一個靈魂說…

Jenkins 詳細安裝、構建部署 使用教程

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 Jenkins是一個開源軟件項目&#xff0c;是基于Java開發的一種持續集成工具&#xff0c;用于監控持續重復的工作&#xff0c;功能包括&…

GPU并行計算版函數圖像生成器

前幾天技術大牛Vczh同學開發了一個函數圖像繪制程序&#xff0c;可以畫出方程f(x,y)0的圖像。他的原理是用圖像上每一點的坐標帶入函數f得到針對x和y的兩個方程&#xff0c;再用牛頓迭代法求解得到一組點集&#xff0c;然后畫到圖像上。用他的程序可以畫出各種各樣令人驚嘆的方…

完全平方公式、平方差公式、一個數負次方

1.完全平方公式&#xff1a; 兩數和&#xff08;或差&#xff09;的平方&#xff0c;等于它們的平方和&#xff0c;加上&#xff08;或減去&#xff09;它們的積的2倍即完全平方公式 (ab)2a2b22ab 兩數和的完全平方公式&#xff08;完全平方和&#xff09; 與(a-b)2a2b2-2ab …

WSS連接服務器端報錯

錯誤&#xff1a; 1. Firefox 和 Chrome 瀏覽器對SSL證書拒絕的錯誤提示是不一樣的&#xff1a; &#xff08;1&#xff09; Chrome報錯&#xff1a;WebSocket connection failed: Error in connection establishment: net::ERR_CERT_AUTHORITY_INVALID &#xff08;2&#xff…

LogBack 入門實踐

一、簡介 前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 LogBack是一個日志框架&#xff0c;它是Log4j作者Ceki的又一個日志組件。 LogBack,Slf4j,Log4j之間的關系 slf4j是The Simp…

20個公司絕對不會告訴你的潛規則

1.入職時的工資高低不重要&#xff0c;只要你努力工作你會得到相應待遇的    我估計幾乎找過工作的人都聽過這句話&#xff0c;當我們確定被聘用跟公司談工資時&#xff0c;他們都會說“如果以后你業績突出、努力工作&#xff0c;你的報酬也會相應增加的”&#xff0c;特別是…